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

TypeScript:合并未知键对象为指定类型并剔除非类型键

解决TypeScript合并对象后过滤多余键的问题

问题核心:你当前的代码仅做了编译时的类型声明,但TypeScript不会在运行时自动剔除不符合类型定义的属性,所以多余的anotherParam会被保留。要实现需求,必须在运行时配合类型约束来过滤键。

解决方案

我们需要让函数在运行时明确知道哪些键是允许的,结合泛型确保类型安全,步骤如下:

  1. 给mergeParameters函数新增参数,传入泛型T的允许键列表;
  2. 合并两个输入对象后,仅保留允许键对应的属性;
  3. 通过类型断言确保返回值严格符合T类型。

完整代码实现

type RequestAdditionalParameters = {
    session?: string | null;
    searchInput?: string | null;
    id?: string | null;
}

// 假设SearchParameters是RequestAdditionalParameters的子类型
type SearchParameters = RequestAdditionalParameters;

export const mergeParameters = <T extends RequestAdditionalParameters>(
    cookies: Record<string, string | null>,
    queryParams: Record<string, string | null>,
    allowedKeys: Array<keyof T> // 新增:传入允许的键列表
): T => {
    // 先合并对象,queryParams会覆盖cookies的同名键
    const merged = { ...cookies, ...queryParams };
    // 过滤出仅包含允许键的对象
    const filtered = allowedKeys.reduce((acc, key) => {
        if (key in merged) {
            acc[key] = merged[key];
        }
        return acc;
    }, {} as T);
    return filtered;
};

// 调用示例
const session = 'kjn33fbf4fkl3w3ff3f3ffuu';
const id = '345644783';
const searchInput = 'stackoverflow';
const anotherParam = 'should not be here';

const additionalParameters = mergeParameters<SearchParameters>(
    { session, id },
    { searchInput, anotherParam },
    ['session', 'searchInput', 'id'] // 指定允许的键
);

// 输出结果(符合期望):
// {
//     session: 'kjn33fbf4fkl3w3ff3f3ffuu',
//     searchInput: 'stackoverflow',
//     id: '345644783'
// }

关键说明

  • 运行时过滤必要性:TypeScript类型系统仅作用于编译阶段,无法直接在运行时获取类型的键,因此必须显式传入allowedKeys作为运行时过滤的依据;
  • 类型安全保障:allowedKeys的类型被约束为Array<keyof T>,确保传入的键一定是T类型中定义的合法键,避免传错;
  • 业务逻辑兼容:合并逻辑保持原有的queryParams覆盖cookies同名键的行为,适配你需要的「URL查询参数覆盖Cookie值」的业务场景。

可选优化:复用允许键列表

如果同一个类型T会被多次调用,可以把允许键列表抽成常量,避免重复编写:

const SEARCH_PARAMS_ALLOWED_KEYS: Array<keyof SearchParameters> = ['session', 'searchInput', 'id'];

// 调用时直接使用常量
const additionalParameters = mergeParameters<SearchParameters>(
    { session, id },
    { searchInput, anotherParam },
    SEARCH_PARAMS_ALLOWED_KEYS
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:05:22