【问题标题】:What is the difference between keyof inside and outside of indexer?索引器内部和外部的keyof有什么区别?
【发布时间】:2018-11-15 23:49:12
【问题描述】:

假设我们有以下 TypeScript 代码:

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

为什么foo 不是字符串,而bar 是?转发keyof obj 和从转发obj 本身获得Key in T 并在映射类型内部执行Key in keyof T 有什么区别? T 参数不是被它的给定值替换了吗?

【问题讨论】:

    标签: typescript generics type-alias


    【解决方案1】:

    一般来说,没有区别,keyof 只是 keyof 参数中存在的所有键(属性和方法名称)的联合类型。

    但从 TypeScript 3.1 开始,有一种特殊情况 - 使用与 keyof 相同的语法来创建 mapped types over tuples and arrays

    在 TypeScript 3.1 中,现在在元组和数组上映射对象类型 生成新的元组/数组,而不是创建一个新类型 push()、pop() 和 length 等成员被转换。

    所以,当存在统一(同态)映射类型时

    type ForwardVal<T> = { 
        [K in keyof T]: string; 
    };
    

    它的参数T 是一个元组或数组类型(在你的情况下它是ForwardVal&lt;number[]&gt;),然后正如文档所说,“只有数字属性被转换”,产生string[] 作为结果类型。

    【讨论】:

    • 谢谢,在数组上测试我的类型映射器只是一个巧合,现在我需要检查最新的语言更新)
    猜你喜欢
    • 2020-06-17
    • 2022-08-12
    • 2018-07-17
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多