如何在TypeScript中使用条件类型筛选接口



我正在尝试创建一个类型,该类型将接口作为泛型类型参数,并过滤掉值不是字符串的属性。

这就是我所拥有的:

interface Bla {
key1: string;
key2: number;
key3: string;
key4: boolean;
}
type PickStrings<T> = {
[K in keyof T]?: T[K] extends string ? T[K] : never;
}
const bla: PickStrings<Bla> = { // should error as key3 is not present 
key1: 'string',
}

游乐场

使用[K in keyof T]?的问题是它不会出错,因为密钥是可选的。但是,如果我使用[K in keyof T],它将检查接口中是否存在所有密钥。

我该怎么解决这个问题?

您可以创建一个类型来按类型提取密钥,然后将其与Pick一起使用

type PickKeysByValueType<T, TYPE> = {
[K in keyof T]: T[K] extends TYPE ? K : never
}[keyof T]
type PickStrings<T> = Pick<T, PickKeysByValueType<T, string>>

游乐场

最新更新