typescript - 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
. 没有什么帮助。去游乐场看看
先感谢您!
解决方案
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 语法,则可以加强检查。
推荐阅读
- python - 在 Ansible 模块中,python 日志记录模块写入到哪里?
- python - 无论做出什么改变,准确率和 F1 分数都是 100%
- python - 为 dev_appserver 导入 python 模块的正确方法是什么?
- gradle-kotlin-dsl - 在不同模块的测试中使用测试包中的代码
- java - 具有 CompletableFuture 的 Java 8 线程:suppletAsync() 后关闭?
- flutter - 如何将 Onpressed 函数添加到列表的每个值
- apache-kafka - 将 kafka-console-producer.sh 运行到另一台服务器
- c# - 如何创建下面描述的涉及列表和数组的方法
- java - 如何将我的 ListView 适配器转换为 RecyclerView 适配器?
- python - 在 Python 中使用带有请求的证书