首页 > 解决方案 > Typescript 在使用对象解析承诺时允许冗余键

问题描述

您能否帮我理解为什么 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. 没有什么帮助。去游乐场看看

先感谢您!

标签: typescriptobjectpromisekey

解决方案


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

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; }>'

test在这种情况下,TypeScript 会将' 的类型推断为Promise<{a: number}>(例如,您的Test类型)。

您还可以检查async函数返回(游乐场链接):

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 语法,则可以加强检查。


推荐阅读