2

プロジェクトの 1 つで予期しない動作が発生していたので、まだ問題がある最小の例にそれを分離しました。最新の TypeScript ビルド 0.9.1.1 を使用しています

module module2 {

    export interface IAnimal {

        colour:string;
    }
}

module module1 {

    export interface IInjector {
        get(className:string):void;
    }
}

module module1 {

    export interface IInjector {
        get(className: "module2.IAnimal"):module2.IAnimal;
    }

    class Injector implements module1.IInjector {

        public get(className:string):any {

            return {colour:"Blue"};
        }
    }

    export var injector:IInjector = new Injector();
}

module module2 {

    module1.injector.get("module2.IAnimal").surname;
}

予想されるエラー エラー TS2094 を生成します: プロパティ '姓' は型 'IAnimal' の値に存在しません。

上位 2 つのモジュール定義を入れ替えると、予想されるエラーが発生しなくなりました

module module1 {

    export interface IInjector {
        get(className:string):void;
    }
}

module module2 {

    export interface IAnimal {

        colour:string;
    }
}

module module1 {

    export interface IInjector {
        get(className: "module2.IAnimal"):module2.IAnimal;
    }

    class Injector implements module1.IInjector {

        public get(className:string):any {

            return {colour:"Blue"};
        }
    }

    export var injector:IInjector = new Injector();
}

module module2 {

    module1.injector.get("module2.IAnimal").surname;
}

IDE で間違いを犯したことを示すエラーが表示されるようにしたいと考えています。私の質問は、最初の例では表示されているのに、2 番目の例では表示されないのはなぜですか?

4

1 に答える 1

0

さて、私はこれについていくつか掘り下げました。コードは、IAnimalインターフェイスが宣言される前に使用されていたかのように動作しています。IInjectorインターフェイス全体を一度に宣言することで同様の動作を得ることができますが、前IAnimalに定義されています。

module module1 {
    export interface IInjector {
        get(className: "module2.IAnimal"):module2.IAnimal;
        get(className:string):void;
    }
}

module module2 {
    export interface IAnimal {
        colour:string;
    }
}

module module1 {
    class Injector implements module1.IInjector {
        public get(className:string):any {
            return {colour:"Blue"};
        }
    }

    export var injector:IInjector = new Injector();
}

module module2 {
    // x is any
    var x = module1.injector.get("module2.IAnimal");
}

おそらく、TypeScript コンパイラがすべてのインターフェイス宣言を 1 つにまとめた場合、最初の場所で宣言されたかのように扱われるため、すべての依存関係がこの時点より前にあることを確認する必要があります。(注: これが正しいと言っているわけではありません。これがどのように動作しているかを示しているだけです)。

次に行うことは、TypeScript の問題リストを確認することです。報告されたこのバグが見つからない場合は、追加して、期待される動作として確認するか、そうでない場合は修正することができます。

于 2013-08-22T09:46:46.950 に答える