映射类型中的打字稿特性

Typescript peculiarities in mapped types

我最近偶然发现了以下片段:

type NamedProperty<Name extends string, T> 
  = { [_ in 0 as Name]: T }

以后使用如下:

type TargetPropertyGroup<Name extends string> 
  = NamedProperty<`has${Capitalize<Name>}Target`, boolean> 
  & NamedProperty<`${Name}Target`, Element> 
  & NamedProperty<`${Name}Targets`, Element[]>

谁能帮我弄明白[_ in 0 as Name]是什么意思?

我也发现了这个 in the playground 但还是...

{ [_ in 0 as Name]: T }{ [_ in Name]: T } 的含义相同,因为键重映射在这里没有任何变化。

在映射类型中,左边部分定义了键,我们通常将其视为[k in MyType][key in MyType]。由于密钥不会被重复使用,因此将其替换为下划线(就像 JS/TS 中使用未使用函数参数的情况一样)。

所以[_ in Name]表示类型名称中的每个键。由于 Name 只是一个字符串,映射类型将只有一个键,即字符串。

{ [_ in 0 as 'myKey']: number }  ===  { myKey: number }

在您给出的示例中 { [Name: string]: T }Name 不是类型而是“变量”。正如您在 playground 中所见,通用参数未被使用。在映射类型中,[Name: string] 每个字符串类型的键。


关于按键重映射,

根据 documentation, the key remapping can be used to infer the keys from template literal types.