2016-11-22 23 views
1
interface Foo { 
    bar() : Promise<string>; 
} 

class MyFoo implements Foo { 
    bar() : string { 
     return ""; 
    } 
} 

class MyFoo2 implements Foo { 
    bar() : Promise<number> { 
     return new Promise<number>(null); 
    } 
} 

上記の2つの実装のいずれもエラーを起こさないはずですか? 理由 - それは、文字列を返し、 ジェネリックのTypescript型ガードは強制されません

  • MyFoo2は約束を返す約束ではないが、間違ったタイプの、およびエラーを取得していないので、

    • MYFOOは、エラーが出るのですか?

    私が知ることは、TypeScriptは返された型のメンバーであり、宣言された型ではないかどうかをチェックするようです。しかし、実装が正しい型を返すようにこのインタフェースを宣言する方法はありますか?

    編集: ES6インタフェースPromisethen() : Promise<T>状部材が、foo(): Tのような何も定義されているため、型チェックが機能しないようです。カスタム汎用インターフェイスでこれをシミュレートすると、インターフェイスにタイプTのメンバが含まれていて、汎用タイプのメンバが含まれていないと正しくエラーになりますT

  • 答えて

    3

    これは現在の安定版のTypeScriptのバグです。

    源:

    すでに固定されており、将来のバージョン(2.1)に含まれます。

    私もそれを自分自身を試してみました:ここ

    D:\Practice\TypeScript\ts-test>npm install -g typescript 
    C:\Users\dezsi\AppData\Roaming\npm\tsc -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsc 
    C:\Users\dezsi\AppData\Roaming\npm\tsserver -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsserver 
    C:\Users\dezsi\AppData\Roaming\npm 
    └── [email protected] 
    
    
    D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --version 
    Version 2.0.10 
    
    D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --target ES6 app.ts 
    
    D:\Practice\TypeScript\ts-test>npm install -g [email protected] 
    C:\Users\dezsi\AppData\Roaming\npm\tsc -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsc 
    C:\Users\dezsi\AppData\Roaming\npm\tsserver -> C:\Users\dezsi\AppData\Roaming\npm\node_modules\typescript\bin\tsserver 
    C:\Users\dezsi\AppData\Roaming\npm 
    └── [email protected] 
    
    
    
    D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --version 
    Version 2.2.0-dev.20161122 
    
    D:\Practice\TypeScript\ts-test>C:\Users\dezsi\AppData\Roaming\npm\tsc.cmd --target ES6 app.ts 
    app.ts(5,7): error TS2420: Class 'MyFoo2' incorrectly implements interface 'Foo'. 
        Types of property 'bar' are incompatible. 
        Type '() => Promise<string>' is not assignable to type '() => Promise<number>'. 
         Type 'Promise<string>' is not assignable to type 'Promise<number>'. 
         Type 'string' is not assignable to type 'number'. 
    

    を最新の2.2.0-dev.20161122が正しくType 'string' is not assignable to type 'number'を報告しながら、あなたは、バージョン2.0.10にしようとすると、私にエラーを与えていないことがわかります。

    +0

    ああ、美しい。それを見つけてくれてありがとう! – Kir

    +0

    奇妙なことに、私はまだ文字列vs "Promise "に関するエラーだけでコンパイルすることができますが、私は同じ正確なサンプルを使用していますか?他の依存関係が間違っている可能性がありますか? 私は[email protected]とTSC 2.0.10を持っています。使用されるlibに影響する可能性のある他の依存関係はありますか? – Kir

    関連する問題