返回特定类型的 TypeScript 键

Posted

技术标签:

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

如果我有以下类型

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

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

【问题讨论】:

【参考方案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

以上是关于返回特定类型的 TypeScript 键的主要内容,如果未能解决你的问题,请参考以下文章

您如何定义具有键字符串索引但具有特定类型的已知键的 TypeScript 接口?

Typescript 对象:如何将键限制为特定字符串?

如何将联合类型指定为对象键 Typescript

TypeScript类型

在 Typescript 中按字符串返回不同的类型

TypeScript--泛型