2016-10-04 88 views
2

我已经使用JSWEET来传输大型Java项目。它在TypeScript中将枚举类型< Object>直接转换为枚举类型< any>。我可以在Typescript中编写一个演员操作符吗?

在Java世界中,可以将一个数组Object []赋给一个Enumeration < Object>。

在打字稿我得到:类型“任何[]”是不能分配给键入“枚举<任何>”

有没有办法来扩展枚举<对象>或[]以这样的方式打字稿将允许这项任务发生?

+1

Java不允许你为'Enumeration '分配一个'Object []',但我永远不会认为你不需要关于Java的答案,所以删除标签。 –

+0

你能告诉我更多关于你的意思吗?“在Java世界中,可以将一个数组Object []指定给枚举”?如果您真的尝试在Java中编写'Enumeration e = anArray;',则会出现类型不匹配错误。那么你在这里的背景是什么? –

+0

我从Java生成Typescript,但是我在我的一些附加部分中犯了一个错误,导致我推测可以在Java中分配这两种类型。虽然看起来不像C++/C#样式转换操作符可以用Typescript编写。 –

回答

0

您可以用两种不同的方式投:

var doSomething = function <T>(a: Enumeration<T>) { }; 
var x: Object[] = []; 

// cast using "<>"" 
doSomething(<Enumeration<Object>>x); 

// cast using "as" 
doSomething(x as Enumeration<Object>); 

但你Enumeration也许应该延长Array

interface Enumeration<T> extends Array<T> { 
    // ... 
} 

更新

class Enumeration<T> extends Array<T> { 
    private _cursor: number; 
    public constructor(...elements: T[]) { 
     super(...elements); 
     this._cursor = 0; 
    } 
    public nextElement() { 
     this._cursor = this._cursor + 1; 
     return this.values[this._cursor]; 
    }; 
    public hasMoreElements() { 
     return this._cursor < this.length - 1; 
    } 
    public static fromArray<T>(arr: T[]) { 
     return new Enumeration<T>(...arr); 
    } 
} 

interface User { 
    name: string; 
} 

let a: Array<User> = [{ name: "user1" }, { name: "user2" }]; 
let b: Enumeration<User> = new Enumeration({ name: "user1" }, { name: "user2" }); 

a = b; // OK: Enumeration<User> is assignable to Array<User> 
b = a; // Error: Array<User> is not assignable to Enumeration<User> 

也许你可以一个方法fromArray增加枚举类:

var doSomething = function <T>(a: Enumeration<T>) { }; 
doSomething(Enumeration.fromArray<User>(a)); 
+0

我没想过扩展Array 。这不会允许从一个方向而不是从另一个方向将枚举分配给数组吗? –

+0

赋值只能在一个方向上工作,但也许你可以在'Enumeration'类中添加一个'fromArray'方法?查看我的更新。 –

+0

扩展内在对象似乎与Typescript达到我正在寻找的一样接近。 –

相关问题