【问题标题】:Typescript allows redundant keys when resolving promise with objectTypescript 在使用对象解析承诺时允许冗余键
【发布时间】:2021-02-26 14:42:49
【问题描述】:

能否请您帮助我理解为什么 Typescript 不会在这里抛出错误:

type Test = Promise<{a: number}>;
const test: Test = Promise.resolve({a: 1, something: 'wrong'}); // no error

但在这里

type Test2 = {a: number};
const test2: Test2 = {a: 1, something: 'wrong'}; // error 2322, ok

我可以做些什么来让它抛出与 Promise 类似的错误吗?

在 Typescript 的不同版本上进行了尝试,包括最新版本,具有严格的类型。 尝试使用 new Promise 而不是 Promise.resolve。没有什么帮助。 看看Playground

提前谢谢你!

【问题讨论】:

    标签: typescript object promise key


    【解决方案1】:

    TypeScript 仅在非常有限的情况下(直接将对象字面量分配给类型化变量,从函数返回对象字面量;details here)进行过多的属性检查,因为尽管从类型系统的角度来看,这些额外的属性很好(它们只是意味着实例是具有更多信息的类型的子类型),将它们放在您分配的对象文字上通常是程序员的错误。否则它不会进行该检查,因为在一般情况下,它很可能不是错误(再次,只是一个子类型)。

    您可以通过向 Promise.resolve 提供类型参数 (playground link) 来触发对 Promise.resolve 的过多属性检查(感谢 jcalz!)

    const test = Promise.resolve<{a: number}>({a: 1, something: 'wrong'});
    //                                               ^^^^^^^^^^^^^^^^^^−− Argument of type '{ a: number; something: string; }' is not assignable to parameter of type '{ a: number; } | PromiseLike<{ a: number; }>'
    

    这样,TypeScript 会将 test 的类型推断为 Promise&lt;{a: number}&gt;(例如,您的 Test 类型)。

    您还可以检查 async 函数返回 (playground link):

    type Test = Promise<{a: number}>;
    async function asyncExample(a: number): Test {
        return {a, extra: true}; // Type '{ a: number; extra: boolean; }' is not assignable to type '{ a: number; }'
    }
    

    ...因此,如果您可以使用 async 函数而不是显式的 promise 语法,您也许可以加强检查。

    【讨论】:

    • 如果您想查看错误,也可以使用Promise.resolve&lt;{ a: number }&gt;({ a: 1, something: 'wrong' });,提供指向excess property checks 的手册链接可能会有所帮助。
    • @jcalz - 哦,我不认为你是。 :-) 我会去做的。顺便说一句,我真的很感谢你向我指出这些东西。
    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多