使用TypeScript声明内联对象的类型

时间:2017-03-05 08:29:23

标签: typescript typescript2.0

正如您所看到的,我创建了一个内联对象,并且我不知道如何声明此对象的类型。

     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但我会更新它。

2 个答案:

答案 0 :(得分:2)

您无需声明对象的类型。类型只是一个编译时工件。这意味着您应该使用它们来发现编译时错误。尝试向内联对象添加类型没有任何区别,因为TypeScript是structurally typed

反过来,这将为数组提供强类型。这样做是为了确保内联对象与您为其返回的数组提供的类型的结构相匹配。这将允许您捕获对象文字中的结构错误

e.g。

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' }) 类型结构匹配,因此没有编译错误。

答案 1 :(得分: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
});