为什么Typescript在未定义的情况下推断出缺失键检索到的值的类型?

为什么Typescript在未定义的情况下推断出缺失键检索到的值的类型?,typescript,undefined,type-inference,Typescript,Undefined,Type Inference,我有以下示例代码: const example: { [key: string]: string } = { a: 'abc' } const b = example['b'] 在运行时,b显然等于undefined,但在编译类型,Typescript推断b类型只是string,而不是string | undefined。这对我来说似乎是个错误 为什么它不推断它是string |未定义的,我如何强制它这样做?这不是一个错误。仅考虑键入:'b'可能是有效密钥 类型{[key:string]:s

我有以下示例代码:

const example: { [key: string]: string } = { a: 'abc' }

const b = example['b']
在运行时,
b
显然等于
undefined
,但在编译类型,Typescript推断
b
类型只是
string
,而不是
string | undefined
。这对我来说似乎是个错误


为什么它不推断它是
string |未定义的
,我如何强制它这样做?

这不是一个错误。仅考虑键入:
'b'
可能是有效密钥

类型
{[key:string]:string}
明确告诉Typescript
示例
可以包含任何键名

Typescript未分析变量。它只比较类型,看它们是否匹配


在下面的typescript中,显示一个错误。因为您列出了可以存在或不存在的密钥

type keys = 'a' | 'foo';

const example: { [key in keys]?: string } = { a: 'abc' }

const b = example['b']


您正在将示例转换为
{[key:string]:string}
类型。换句话说,您告诉typescript它始终是一个字符串。typescript无法分析它是否真的存在,因为它是一种静态类型语言。

通过将类型转换为
{[key:string]:string}
来扩展类型,因此从类型角度来看,
'b'
'a'
一样有效。省略该类型并让typescript推断更窄的类型,将抛出错误:

const-example={a:'abc'};
//错误:属性“b”不存在
常数b=示例['b'];
有一个关于添加
| undefined
索引查找的讨论,它实际上是通过
noUncheckedIndexedAccess
标志解决的。如果设置了,则
b
将是
string |未定义的
,即使在您的示例中也是如此


“'b'可能是一个有效的密钥”-这是真的,但它只是“可能是”。它不提供保证它是有效的,不同于具有显式不可选键的类型。使用类型<代码> {[Ko:String ]:Strase}/Cult>,Type Script认为每个键都存在。它永远不会向你显示错误。这就是它的工作原理。@GrégoryNEUT是正确的。编译器按照你告诉它的去做,而不是你想要它做的。你的例子仍然不允许任意键。我想告诉编译器,我不知道对象中将存在或不存在哪些键,只是它们将是字符串。您没有指定
example
可以包含
未定义的
。您可以使用
{[key:string]:string | undefined}
{[key:string]?:string}
@VLAZ使用
noUncheckedIndexedAccess
标志,让typescript在索引查找时自动添加
| undefined
。@Aplet123啊,很有用!这似乎是一个新的财产。