在下面的类型定义中,为什么P1P2有不同的值?

type P1 = (() => 22) extends {[k:string]:any} ? 1:2 //`P1 == 1`
type P2 = (() => 22) extends {[k:string]:unknown} ? 1:2 //`P2 == 2`

推荐答案

请参见Breaking Change: { [k: string]: unknown } is no longer a wildcard assignment target以获得权威答案.

index signature {[k: string]: any}在TypeScrip中表现特殊:它是任何对象类型的有效赋值目标.通常,像() => 22这样的类型不会被赋予implicit index signatures,因此将() => 22赋给{[k: string]: unknown}是错误的.只有当属性类型为any时,您才会获得特殊的允许行为:

let anyRec: { [k: string]: any };
anyRec = () => 22; // okay

let unkRec: { [k: string]: unknown };
unkRec = () => 22; // error

这就是P1P2不同的原因.

Playground link to code

Typescript相关问答推荐

为什么缩小封闭内部不适用于属性对象,但适用于声明的变量?

如何为父类构造函数中的修饰属性赋值?

基于平台的重定向,Angular 为16

数组文字中对象的从键开始枚举

rxjs forkJoin在错误后不会停止后续请求

如何根据特定操作隐藏按钮

被推断为原始类型的交集的扩充类型的交集

如何在Reaction Query Builder中添加其他字段?

在保留类型的同时进行深层键名转换

通过泛型函数本身推断受约束的泛型参数的类型脚本问题

判断映射类型内的键值的条件类型

使用Cypress测试从Reaction受控列表中删除项目

字符串文字联合的分布式条件类型

为什么数字是`{[key:string]:UNKNOWN;}`的有效密钥?

如何创建由一个帐户签名但使用另一个帐户支付的Hedera交易

有没有什么方法可以使用ProvideState()提供多个削减器作为根减减器

Typescript不允许在数组中使用联合类型

映射类型不是数组类型

如何使对象同时具有隐式和显式类型

递归JSON类型脚本不接受 node 值中的变量