Typescript 按属性类型筛选接口或类型

Typescript 按属性类型筛选接口或类型,typescript,Typescript,我有这个类型 type Obj = { name: string; age: number; birth: Date; weight: number; height: number; } 我想筛选其属性扩展为number | string的Obj,即我想获取 type Filtered = { name: string; age: number; weight: number; height: number; } 我查找了Typescript实用程序类型,

我有这个
类型

type Obj = {
  name: string;
  age: number;
  birth: Date;
  weight: number;
  height: number;
}
我想筛选其属性扩展为
number | string
的Obj,即我想获取

type Filtered = {
  name: string;
  age: number;
  weight: number;
  height: number;
}

我查找了Typescript实用程序类型,但没有一个满足我的需要。如何实现这一点?

使用基于属性值查找属性的帮助器:

type PropertyOfValue<T, V> = {
  [K in keyof T]-?: T[K] extends V
    ? K
    : never
}[keyof T];
type PropertyOfValue={
[K in keyof T]-?:T[K]扩展V
K
:从不
}[keyof T];
现在,我们可以通过执行以下操作找到要查找的属性,并从源对象中拾取它们:

type Filtered = Pick<Obj, PropertyOfValue<Obj, string | number>>
type Filtered=Pick
奖金

如果愿意,可以抽象按值拾取的模式,并将其放在全局命名空间中

declare global {
  namespace Pick {
    type ByValue<T, U> = Pick<T, PropertyOfValue<T, U>>
  }
}
声明全局{
名称空间选取{
键入ByValue=Pick
}
}
用法:

type Filtered = Pick.ByValue<Obj, string | number>
type Filtered=Pick.ByValue

使用基于属性值查找属性的帮助器:

type PropertyOfValue<T, V> = {
  [K in keyof T]-?: T[K] extends V
    ? K
    : never
}[keyof T];
type PropertyOfValue={
[K in keyof T]-?:T[K]扩展V
K
:从不
}[keyof T];
现在,我们可以通过执行以下操作找到要查找的属性,并从源对象中拾取它们:

type Filtered = Pick<Obj, PropertyOfValue<Obj, string | number>>
type Filtered=Pick
奖金

如果愿意,可以抽象按值拾取的模式,并将其放在全局命名空间中

declare global {
  namespace Pick {
    type ByValue<T, U> = Pick<T, PropertyOfValue<T, U>>
  }
}
声明全局{
名称空间选取{
键入ByValue=Pick
}
}
用法:

type Filtered = Pick.ByValue<Obj, string | number>
type Filtered=Pick.ByValue