gpt4 book ai didi

使用对象解析 promise 时, typescript 允许冗余键

转载 作者:行者123 更新时间:2023-12-04 08:02:30 24 4
gpt4 key购买 nike

你能帮我理解为什么 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 只在非常有限的情况下进行额外的属性检查(将对象字面量直接分配给类型化变量,从函数返回一个对象字面量; details here ),因为尽管从类型系统的角度来看,这些额外的属性很好(它们只是意味着instance 是具有更多信息的类型的子类型),将它们放在您分配的对象文字上通常是程序员的错误。它不会以其他方式进行检查,因为在一般情况下,它很可能不是错误(再次,只是一个子类型)。
您可以在 Promise.resolve 上触发多余的属性检查通过为其提供类型参数( playground link )(感谢 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<{a: number}> (例如,您的 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 时, typescript 允许冗余键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66387822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com