2017-03-05 34 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型结构,所以不需要编译错误。