You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript如何无需显式传参筛选类中Custom类型的键?

如何从类中筛选仅含Custom泛型类型的属性?

现有如下TypeScript代码,目标是从Test类创建一个仅包含Custom类型键的新映射类型。Custom仅作为泛型注解存在,无特殊实现。当前代码中CustomKeys会包含两个属性,但将判断条件改为extends Custom<string>时能正常筛选。请问有没有无需指定显式类型的实现方式?

type Custom<T extends any = unknown> = T;

class Test {
  customProperty!: Custom<string>;
  notCustomProperty!: number;
}

type PickCustomKeys<T> = {
  [K in keyof T as T[K] extends Custom ? K : never]: T[K];
};

type CustomKeys = PickCustomKeys<Test>

问题原因

当前判断条件T[K] extends Custom会把Custom解析为默认的Custom<unknown>,而number extends unknown始终成立,所以notCustomProperty被错误地包含进来了。

解决方案

利用TypeScript的infer关键字,检测属性类型是否是Custom泛型的任意实例,无需指定具体泛型参数:

type Custom<T extends any = unknown> = T;

class Test {
  customProperty!: Custom<string>;
  notCustomProperty!: number;
}

type PickCustomKeys<T> = {
  [K in keyof T as T[K] extends Custom<infer _> ? K : never]: T[K];
};

type CustomKeys = PickCustomKeys<Test>;
// CustomKeys 类型仅包含 customProperty 属性

原理说明

Custom<infer _>会尝试将T[K]匹配到Custom的泛型结构,不管推断出的类型参数_具体是什么,只要属性是Custom包裹的类型,就会保留对应的键。这种方式可以适配Custom的任意泛型参数,无需显式指定。

内容的提问来源于stack exchange,提问作者Diyan Slavov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:02:02