2017-03-05 18 views
1

私はオブジェクトをインラインで作成していますが、このオブジェクトの型を宣言する方法はわかりません。TypeScriptでインラインオブジェクトの型を宣言する

 zuite.getAfters().push({ // inline object here 
     timeout: obj.opts.timeout || 11000, 
     desc: obj.desc || (obj.fn ? obj.fn.name : '(unknown)'), 
     fn: obj.fn, 
     type: 'after/teardown', 
     warningErr: new Error('SUMAN_TEMP_WARNING_ERROR') 
     }); 

zuitegetAfters()には、以下のシグネチャを持っている:

type TestSuiteGetterFn <T> =() => Array<T>; 


interface Zuite { 

    injectedValues: Object, 
    getInjections: Function, 
    getAfters: TestSuiteGetterFn<any>, 

} 

私はタイプをインラインで宣言する必要がありますか?または、私はZuiteインターフェースとTestSuiteGetterFnタイプで宣言された型に頼っていますか? (この場合、それだけでanyだが、私はそれを更新します

答えて

1

あなたは文字通りあなたのオブジェクトの新しいタイプを作成し、Zuite.getAftersのための宣言を変更することができます。

interface SomeType { 
    ctx: Zuite, 
    timeout: number 
    // ...and so on 
} 

type TestSuiteGetterFn <T> =() => Array<T>; 

interface Zuite {  
    injectedValues: Object, 
    getInjections: Function, 
    getAfters: TestSuiteGetterFn<SomeType>, // Notice `SomeType` instead of `any` 
} 

// Your object literal is typed as `SomeType` now 
zuite.getAfters().push({ 
    ctx: zuite, 
    timeout: obj.opts.timeout || 11000, 
    // ...and so on 
}); 
2

あなたは型を宣言する必要はありません。コンパイル時エラーを発見するためにそれらを使用する必要があることを意味します。TypeScriptがタイプスクリプトと同じようにインラインオブジェクトに型を追加しようとすると、違いはありません。structurally typed

ですが、typですe TestSuiteGetterFn。これは順番に、配列に強いタイピングを与えます。これは、インラインオブジェクトが返す配列に与えた型の構造に一致することを確認します。これにより、オブジェクトリテラルの構造的エラーをキャッチできます。

type TestSuiteGetterFn <T> =() => Array<T>; 

interface Message { 
    message: string; 
} 

interface Zuite { 
    getAfters: TestSuiteGetterFn<Message>, 
} 

失敗

zuite.getAfters().push({ 
    badProperty: true 
}) 

上記Message型と一致しないオブジェクトリテラルの構造は、(ここでは構造的なタイピングがプレイしている)ので、コンパイルエラーが発生します。ここでは、オブジェクトリテラルマッチMessage型構造

zuite.getAfters().push({ 
    message: 'hey there' 
}) 

OK

、ありませんのでコンパイルエラー。

関連する問題