【问题标题】:TypeScript keyof returning specific type返回特定类型的 TypeScript 键
【发布时间】:2018-09-19 23:39:38
【问题描述】:

如果我有以下类型

interface Foo {
    bar: string;
    baz: number;
    qux: string;
}

我可以使用typeof 键入一个参数,这样它只需要返回stringFoo 的键('bar''qux')?

【问题讨论】:

    标签: typescript types


    【解决方案1】:

    Typescript 4.1 及以上版本

    通过在映射类型中添加as 子句,我们现在可以将原始类型简化为:

    type KeyOfType<T, V> = keyof {
        [P in keyof T as T[P] extends V? P: never]: any
    }
    

    Playground Link

    原答案

    您可以在 Typscript 2.8 中使用条件类型:

    type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp? P : never }[keyof T];
    
    let onlyStrings: KeysOfType<Foo, string>;
    onlyStrings = 'baz' // error
    onlyStrings = 'bar' // ok
    
    let onlyNumbers: KeysOfType<Foo, number>;
    onlyNumbers = 'baz' // ok
    onlyNumbers = 'bar' // error 
    

    Playground Link

    【讨论】:

    • 感谢您的回答。在我使用它时,我发现我需要扩展KeysOfType 以包含keyof T &amp; { [P ....,否则我不能使用KeysOfType 来下标T
    猜你喜欢
    • 2021-01-03
    • 2021-05-28
    • 2021-08-06
    • 1970-01-01
    • 2021-10-17
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多