如何在TypeScript中实现函数两个参数的类型映射?
实现键与对应属性类型匹配的函数
要实现这个需求,你需要用泛型来关联两个参数的类型,让TypeScript能根据第一个参数的键类型,推断出第二个参数的正确类型。
正确实现代码
type SomeType = { name: string; quantity: number; }; // 用泛型K约束为SomeType的键类型 const someFunc = <K extends keyof SomeType>( key: K, value: SomeType[K] ) => { // 函数逻辑 }; // 合法调用 someFunc("name", "John"); someFunc("quantity", 10); // 类型错误(符合预期) someFunc("name", 10); // 类型“number”的参数不能赋给类型“string”的参数 someFunc("quantity", "John"); // 类型“string”的参数不能赋给类型“number”的参数
为什么之前的写法无效?
你之前的写法里,key: keyof SomeType是所有键的联合类型("name" | "quantity"),value: SomeType[keyof SomeType]是所有属性类型的联合类型(string | number)。这两个参数的类型是独立的,TypeScript只会检查value是否属于联合类型中的某一种,不会关联到具体的key,所以会出现someFunc("name", 10)这种不符合预期的合法情况。
而泛型写法中,泛型K会被推断为当前传入的具体键类型(比如传入"name"时,K就是"name"),value: SomeType[K]就会被精确约束为该键对应的属性类型(string),从而实现键与值类型的精准匹配。
内容的提问来源于stack exchange,提问作者E. Guzman
相关产品推荐
相关产品推荐

