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

如何在TypeScript中实现排除多基础类型的过滤函数?

在TypeScript中实现多类型参数的基础类型过滤函数

当然可以实现支持多类型参数的版本,核心思路是通过泛型捕获传入的类型参数字面量,再通过类型映射将字符串类型转为对应的TypeScript基础类型,最后结合Exclude完成类型排除。

完整实现代码

// 定义字符串类型到TS基础类型的映射
type BasicTypeMap = {
    string: string;
    number: number;
    boolean: boolean;
    bigint: bigint;
};

// 基础类型的字符串枚举
type BasicType = keyof BasicTypeMap;

function removeByType<T, U extends BasicType[]>(
    input: T[],
    ...types: U
): Exclude<T, BasicTypeMap[U[number]]>[] {
    // 实际过滤逻辑示例(可根据需求调整)
    return input.filter(item => {
        const itemType = typeof item as BasicType;
        return !types.includes(itemType);
    }) as Exclude<T, BasicTypeMap[U[number]]>[];
}

用法示例

const input = [1, 2, 3, 'four', false]; // 类型自动推导为 (number | string | boolean)[]

// 移除string和boolean类型,返回值类型自动推导为number[]
const res = removeByType(input, 'string', 'boolean');

实现原理解析

  1. 类型映射:BasicTypeMap将'string'这类字符串字面量映射为TypeScript原生的string类型,实现字符串类型到实际TS类型的转换。
  2. 泛型捕获:U extends BasicType[]用于捕获传入的types参数的具体字面量类型(比如传入'string'和'boolean'时,U[number]就是'string' | 'boolean')。
  3. 类型排除:通过BasicTypeMap[U[number]]得到需要排除的TS基础类型联合,再用Exclude<T, ...>从输入数组的类型T中移除这些类型,最终得到正确的返回数组类型。

对比单类型重载方案

相比你之前写的单类型重载,这个方案:

  • 支持任意数量的类型参数,无需手动编写多个重载声明
  • 类型推导完全自动,调用时无需额外指定泛型参数
  • 代码更简洁,扩展性更强(如需新增基础类型,只需在BasicTypeMap中添加对应映射)

补充说明

你提到的最终可运行实现已整合到iter-ops库的自定义操作符中,可直接用于实际项目开发。

内容的提问来源于stack exchange,提问作者vitaly-t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:45:31