映射类型中的打字稿特性
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.
我最近偶然发现了以下片段:
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.