【问题标题】:TypeScript alias for asserting value type for keyof用于为 keyof 断言值类型的 TypeScript 别名
【发布时间】:2020-05-11 21:41:37
【问题描述】:

很难发现是否可以使用类型别名断言属性的值类型。 这是我的例子:

    type Primitive = string | number | boolean; 

    function comparePrimitives(a:Primitive, b:Primitive): number { /*...*/ }

    export function fromKey<T extends object> (key: keyof T)
    {
        return function(a: T, b: T): number {
            return comparePrimitives(a[key], b[key]); // TS2345
        };
    }

我遇到的问题是,发生了 TS2345。 我希望能够构建一个函数签名,它只允许 T[keyof T] 是原始值。

【问题讨论】:

    标签: typescript types type-alias keyof


    【解决方案1】:

    因为comparePrimitives 参数是Primitives,所以T 应该从具有Primitive 值的对象扩展而来。 工作代码sn-p详解:

    type Primitive = string | number | boolean; 
    
    function comparePrimitives(a:Primitive, b:Primitive): number { /*...*/ }
    
    export function fromKey<T extends { [key: string]: Primitive }> (key: keyof T)
    {
        return function(a: T, b: T): number {
            return comparePrimitives(a[key], b[key]); // no TS2345
        };
    }
    

    【讨论】:

    • 我喜欢你用这个去的地方,但这意味着 T 的每个属性都必须是原始值。这会为任何不匹配的内容创建 TS2344 错误。
    • 这是另一个可能有帮助的问题...假设我们有一个函数:function hasMember (instance: any, property: string): boolean {} 你怎么能键入这个函数作为类型保护来产生instance is { property: unknown }。其中“财产”是提供的关键。相当于'x' in y 的类型保护。
    • 我认为输入别名Pick&lt;T, K extends keyof T&gt; 可能有用。
    • 我的意思是:我认为输入别名 PickRecord 可能有用。
    • 重要的部分是我试图验证只有请求的键具有原始值类型。我觉得使用 Record 已经非常接近 b,但我缺少一些高级打字语法。
    猜你喜欢
    • 2023-02-18
    • 2019-08-21
    • 2022-11-21
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多