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

如何限制函数仅接收包含指定键的对象参数?

问题描述

现有函数:

const myFunc = (object) => // 执行逻辑

希望调用该函数时,仅允许传入包含指定类型MyType中部分或全部键的对象,禁止传入无关键。例如已定义类型:

type MyType = {
   a: string
   b: number
}

要求:

  • myFunc({a: "5"}) 或 myFunc({b: 10}) 合法
  • myFunc({c: 12}) 报错

想知道如何定义函数实现这种键的限制,猜测可能用到keyof或typeof但不清楚具体用法。

解决方案

你可以通过**泛型结合keyof**来实现这个需求,确保传入的对象只能包含MyType中定义的键,同时支持传入任意子集(单个或多个键)。

方法1:用Partial<MyType>(简单直接)

Partial<MyType>会把MyType的所有键设为可选,TypeScript对对象字面量的额外属性检查会自动拦截无关键:

type MyType = {
  a: string;
  b: number;
};

const myFunc = (object: Partial<MyType>) => {
  // 这里写你的业务逻辑
};

// 合法调用
myFunc({a: "5"});
myFunc({b: 10});
myFunc({a: "test", b: 20});

// 报错:对象字面量只能指定已知属性,'c'不在类型 'Partial<MyType>' 中
myFunc({c: 12});

方法2:泛型+Pick(更精确控制)

如果需要明确限定传入的是MyType的某几个特定键,可以用泛型结合Pick和keyof:

type MyType = {
  a: string;
  b: number;
};

// K 是 MyType 键的子集,默认值为所有键
const myFunc = <K extends keyof MyType = keyof MyType>(object: Pick<MyType, K>) => {
  // 这里写你的业务逻辑
};

// 合法调用
myFunc({a: "5"});
myFunc({b: 10});
myFunc({a: "test", b: 20});

// 报错:类型 '{ c: number; }' 的参数不能赋给类型 'Pick<MyType, never>' 的参数
myFunc({c: 12});

关于keyof的作用

keyof MyType会生成一个联合类型 "a" | "b",通过K extends keyof MyType,我们限制了泛型K只能是这个联合类型的子集,确保传入的对象键都属于MyType的定义范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:43:12