gpt4 book ai didi

javascript - Typescript 确实分配给对象类型定义中不存在的对象属性

转载 作者:行者123 更新时间:2023-12-05 05:33:20 27 4
gpt4 key购买 nike

我不明白为什么 Typescript 没有将此高亮显示为错误...

当我有条件地向对象添加该对象类型定义中不存在的新属性时,Typescript 会分配它

  type Filters = {
keywords: Array<string>
}

const condition = 1;

let filters: Filters = {keywords: ['keyword']}

filters = {
...filters,
...(condition && {...{ tags: ['tag']}}),
}

结果:

filters: {
keywords:["keyword"]
tags:["tag"]
}

虽然我预计会出现此错误:

Object literal may only specify known properties, and 'tags' does not exist in type 'Filters'.

PS:当我尝试以这种方式添加相同的属性时,我得到了预期的错误:

filters = {...filters, tags: ['tag']}

最佳答案

这是 TypeScript 目前缺少的功能; excess property checks只发生在某些上下文中,到目前为止,还没有人对传播到外部对象中的内联对象的内容进行上下文检查。

microsoft/TypeScript#39998 有一个开放的功能请求.它目前被标记为“等待更多反馈”,因此您可能想要解决该问题,给它一个 👍,并在评论中描述您的用例及其引人注目的原因。我怀疑采取这样的行动是否会产生很大的效果,但不会造成伤害。


据我所知,没有一个很好的解决方法来解决这个问题。如果你想使用像

这样的辅助函数
const noExcess = <T extends object>() =>
<U extends { [K in keyof U]: K extends keyof T ? T[K] : never }>(u: U) => u;

并将其专门用于过滤器:

const noExcessFilters = noExcess<Filters>();

然后调用它:

const z = noExcessFilters({
...filters,
...(condition && { tags: ['tag'] }),
}); // error! Types of property 'tags' are incompatible.

它会标记这种情况,但我不知道这对你来说是否值得。

Playground link to code

关于javascript - Typescript 确实分配给对象类型定义中不存在的对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73897908/

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