TypeScript如何限制函数参数为指定interface中类型为number的键名
实现方案
这个需求可以通过TypeScript的条件类型实现,具体方案如下:
核心工具类型
首先构造一个通用工具类型,用于从指定接口中筛选出值为指定类型的键,组成联合类型:
type KeysOfType<T, TargetType> = { [K in keyof T]: T[K] extends TargetType ? K : never }[keyof T]
工具类型逻辑说明:
- 遍历泛型T的所有键,判断每个键对应的值类型是否匹配目标类型TargetType
- 匹配则保留键名,不匹配则返回never
- 最后取所有属性值的联合,never会自动被过滤,最终得到的就是所有符合类型要求的键名联合
完整可运行代码
替换你代码中<SOME MAGIC HERE>的位置即可:
interface dto { aaa: string, bbb: number, ccc: boolean, ddd: number, } type KeysOfType<T, TargetType> = { [K in keyof T]: T[K] extends TargetType ? K : never }[keyof T] const variable: dto = { aaa: "hello", bbb: 42, ccc: false, ddd: 914 }; function test(param: KeysOfType<dto, number>): number { return variable[param] + 10; } console.log(test("aaa")); // 类型报错:dto.aaa类型为string,不符合要求 console.log(test("ccc")); // 类型报错:dto.ccc类型为boolean,不符合要求 console.log(test("eee")); // 类型报错:"eee"不属于dto的合法键 console.log(test("bbb")); // 正常运行,返回52
校验效果
入参只能是"bbb"或"ddd"两种字面量,其他所有值都会触发类型报错,完全符合需求的限制要求。
内容的提问来源于stack exchange,提问作者kaytrance
相关产品推荐
相关产品推荐

