




























这是一个创建于 631 天前的主题,其中的信息可能已经有所发展或是发生改变。
type Obj = { xxxFoo?: number ,xxxBar?: number }
declare function func(obj: Obj): void
type Suffix = 'Foo'
const s: Suffix = 'Foo'
func({
[`xxx${'Bar'}`]: 2,
[`yyy${'Foo'}`]: 2, // 这行会报错,符合预期
[`yyy${s}`]: 3, // 但这行为什么不会报错???!!!
[`xxx${s}` satisfies keyof Obj]: 4
})
为什么那行不会报错,和上一行到底有什么区别啊?我也是服了,所有上火的地方都上在 TypeScript 上。
1 nno 2024 年 9 月 21 日gpt 的回答 在这里,TypeScript 看到的是一个动态计算的键名 yyy${s}。尽管 s 的值是 'Foo',它不会直接解析为 yyyFoo 。TypeScript 只知道这是一个字符串键,没有对该键进行进一步的类型检查,因此不会报错。 |
2 dfourc 2024 年 9 月 21 日确实,虽然 v2 不能贴 ai 的回答,这贴应该可以吧~ |
3 june4 2024 年 9 月 21 日@nno @galikeoy 感觉没这么简单 |
4 june4 2024 年 9 月 21 日const s: () => Suffix = () => 'Foo' |
5 civetcat 2024 年 9 月 21 日我试了一下,如果 s 变量不强制指定为 Suffix,让它自动推断是可以的。但是指定了 s 的类型,就无法推断成功了/。如果显示指定类型,ts 能判断出来一个不可变的字符串字面量类型,但是显示指定了 type 类型,导致 s 变成一个类型,但是这个类型是可变的?比如重新定义 Suffix 的类型为其他类型,可能是处于这种情况导致无法进一步推断? |
6 xiangyuecn 2024 年 9 月 21 日"yyyFoo" //编译时检查? 另外加一句,一定非要写这么奇怪的代码吗? |
7 june4 2024 年 9 月 21 日@civetcat typescript 对参数明明有这个能力啊? type Suffix2 = 'Foo' | 'Bar' 这个能力放到对象键上就失效了? |
8 june4 2024 年 9 月 21 日@xiangyuecn 这个代码不奇怪吧,业务上明明很多地方用到的。这些代码是我出错后简化而来的。 |
9 AV1 2024 年 9 月 21 日TS 检查对象属性的时候,只会对多余的*字面量*( literal )属性报错。对于*非字面量*对象,以及*非字面量*属性,会按照*协变*规则判断类型是否符合规则。 let a: { a: number } = { a: 1 } let ab: { a: number, b: number } = { a: 1, b: 2 } a = { a: 1, [Math.random()]: 6 } //虽然多了个属性,但它不是字面量,所以不报错 |
11 lisongeee 2024 年 9 月 21 日因为 typescript 没你想的这么智能 let x: number | undefined = undefined; 另外建议没必要过于纠结 typescript 的类型体操,比如我会尽量避免复杂类型,能用 interface 就不用 type 当然你要用特性什么想用就是了,如果觉得不好用,完全可以 fork 自己改一份,虽然大多数人没那能力 |
12 zbinlin 2024 年 9 月 21 日还是 Typescript 类型推导还不够强大 /🐶 你如果声明一个这样的变量: ``` 你会发现 typescript 推导成: ``` 你也可以像第四行那样,加上 `satisfies` 操作符来验证。 ``` 当然,可以试试去 Github 的 Typescript 项目里问问,说不准可能是个 bug 。:) |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。