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[]
作为结果类型。

谢谢,在数组上测试我的类型映射器只是一个巧合,现在我需要检查最新的语言更新)