首页 > 解决方案 > 是否可以按值类型过滤键?

问题描述

我想按对象类型的值类型过滤类型。

在当前的打字稿规范中是否有可能?

type a = {
  a: '123'
}

type b = {
  b: '123'
}

tpye c = {
  a: '123',
}

type map = {
  first: a,
  second: b,
  third: c,
}

type HavingAValueMap = Magic<map>; // pick value with having 'a' property
// { first: {...}, third: {...} }

标签: typescript

解决方案


我通过使用 TS 4.1 新的 Feature Key Remapping解决了


type a = { a: string}
type b = { b: string}

type map = {
  first: a;
  second: b;
  third: a;
}

type FilterMapType<T, F> = { [K in keyof T]: T[K] extends F ? T[K] : never }

type CheckValidKey<T, K extends keyof T> = T[K] extends never ? never : K;

type FilterObjectByType<T, F> = {[K in keyof T as CheckValidKey<FilterMapType<T, F>, K>]: T[K]}
 
type HavingAValueMap = FilterObjectByType<map, a> // { first: { a: string }, third: { a: string} }

推荐阅读