繁体   English   中英

为什么 TypeScript 类型保护“in”不将类型缩小为 keyof 类型?

[英]Why doesn't TypeScript type guard 'in' narrows types to keyof types?

考虑这个代码:

const obj = {
    a: 1,
    b: 2
}

let possibleKey: string = 'a'

if (possibleKey in obj) console.log(obj[possibleKey])

possibleKey in obj为 true 时,我们知道possibleKey类型为keyof typeof obj ,对吗? 为什么 TypeScript 类型系统没有检测到并将string缩小到该类型? 相反,它说:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ a: number; b: number; }'.

根据文档

对于n in x表达式,其中n是字符串文字或字符串文字类型, x是联合类型,“true”分支缩小到具有可选或必需属性n ,“false”分支缩小到类型其中有一个可选的或缺失的属性n

换句话说, n in x缩小了x ,而不是n ,并且仅适用in联合类型中的字符串文字或字符串文字类型。 要使该表达式起作用,您必须向编译器提供更多信息,例如使用类型断言

if (possibleKey in obj) {
  console.log(obj[<keyof typeof obj>possibleKey]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM