TypeScript中如何通过同函数一个参数动态定义另一参数类型
实现方案
你需要的动态类型约束效果完全可以实现,核心是使用受约束的泛型参数关联两个参数的类型。
你最初的写法无法生效的原因是:形参名x仅存在于值层面,类型系统无法直接将它作为类型索引使用,需要先定义一个泛型类型变量捕获第一个参数传入的实际字面量类型,再用这个类型变量去索引目标类型,得到第二个参数的约束类型。
具体实现代码
type MyType = { key1: string, key2: number, key3: Array<number> } // 定义泛型参数K,约束为MyType的所有合法键的联合类型 function myFunction<K extends keyof MyType>(x: K, y: MyType[K]) { // 函数内部逻辑,y的类型会随x的传入值自动推导 }
类型校验效果
上述实现完全匹配你预期的校验规则:
myFunction('key1', 'some string'):编译正常,key1对应属性类型为string,第二个参数类型匹配myFunction('key1', 1):抛出类型错误,number类型不符合key1要求的string类型myFunction('key2', 1):编译正常,key2对应属性类型为number,参数匹配myFunction('key3', 'another string'):抛出类型错误,string类型不符合key3要求的Array<number>类型
扩展用法
如果需要适配任意对象类型而非固定的MyType,可以把源对象类型也声明为泛型,实现通用的键值约束逻辑:
// 通用版本:可对任意对象的键、值做关联约束 function setProperty<T, K extends keyof T>(target: T, key: K, value: T[K]) { target[key] = value; }
箭头函数写法同样支持该逻辑:
const myArrowFunc = <K extends keyof MyType>(x: K, y: MyType[K]) => { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Rafael Furtado
相关产品推荐
相关产品推荐

