如何限制函数仅接收包含指定键的对象参数?
问题描述
现有函数:
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
相关产品推荐
相关产品推荐

