2017-03-05 92 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

應該雖然,是典型的e TestSuiteGetterFn。這反過來,給陣列打了強大的打字。這樣做是確保內聯對象匹配您返回給它的數組類型的結構。這將使您能夠捕捉到對象文字

的結構錯誤,例如,

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

interface Message { 
    message: string; 
} 

interface Zuite { 
    getAfters: TestSuiteGetterFn<Message>, 
} 

故障

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

以上會導致編譯錯誤,因爲對象文字不匹配Message類型的結構(這裏是結構性的打字在播放)。

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

在這裏,對象文字匹配的Message型結構,所以不需要編譯錯誤。