3

JSWEET を使用して大規模な Java プロジェクトをトランスパイルしました。Enumeration<Object> のような型を TypeScript の Enumeration<any> に直接変換しました。

Java の世界では、配列 Object[] を Enumeration<Object> に割り当てることができました。

Typescript で取得: Type 'any[]' is not assignable to type 'Enumeration<any>'

Enumeration<Object> OR any[] を拡張して、TypeScript がこの割り当てを実行できるようにする方法はありますか?

4

1 に答える 1

0

次の 2 つの方法でキャストできます。

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));
于 2016-10-04T12:11:29.343 に答える