Typescript 索引器内部和外部的键有什么区别?
假设我们有以下类型脚本代码:Typescript 索引器内部和外部的键有什么区别?,typescript,generics,type-alias,Typescript,Generics,Type Alias,假设我们有以下类型脚本代码: type ForwardVal<T> = { [K in keyof T]: string; }; type ForwardKeyOf<T extends string | number | symbol> = { [K in T]: string; }; type ByObj = ForwardVal<number[]>; // string[] type ByKeyOf = For
type ForwardVal<T> = {
[K in keyof T]: string;
};
type ForwardKeyOf<T extends string | number | symbol> = {
[K in T]: string;
};
type ByObj = ForwardVal<number[]>; // string[]
type ByKeyOf = ForwardKeyOf<keyof number[]>; // { length: string, toString: string, ... }
type foo = ByObj['push']; // (...items: string[]) => number
type bar = ByKeyOf['push']; // string
type ForwardVal={
[K in keyof T]:字符串;
};
类型ForwardKeyOf={
[K in T]:字符串;
};
类型ByObj=ForwardVal;//字符串[]
类型ByKeyOf=ForwardKeyOf;//{length:string,toString:string,…}
输入foo=ByObj['push'];//(…项:字符串[])=>number
键入bar=ByKeyOf['push'];//一串
为什么foo
不是字符串,而bar
是字符串?从转发obj
本身到在映射类型内部执行Key-in-Key-of-T
,转发Key-of-obj
和拥有Key-in-T
之间的区别是什么?
t
参数不是被它的给定值替换了吗?一般来说,没有区别,keyof
只是keyof
参数中存在的所有键(属性和方法名称)的联合类型
但是从TypeScript 3.1开始,有一种特殊情况-使用与keyof
相同的语法来创建
在TypeScript 3.1中,现在已将对象类型映射到元组和数组上
生成新的元组/数组,而不是在
转换push()、pop()和length等成员
因此,当存在统一(同态)映射类型时
type ForwardVal<T> = {
[K in keyof T]: string;
};
type ForwardVal={
[K in keyof T]:字符串;
};
它的参数
T
是元组或数组类型(在您的例子中是ForwardVal
),然后正如文档所说,“只转换数值属性”,生成string[]
作为结果类型。谢谢,在数组上测试我的类型映射器只是一个巧合,现在我需要检查最新的语言更新)