繁体   English   中英

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

[英]Declare type of inline object with 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但我会更新。

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

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

例如

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

interface Message {
  message: string;
}

interface Zuite {
  getAfters: TestSuiteGetterFn<Message>,
}

失败

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

以上将导致编译错误,因为对象文字的结构与Message类型不匹配(这里是play中的结构类型)。

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

这里对象文字与Message类型结构匹配,因此没有编译错误。

您可以为对象文字创建新类型,并更改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
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM