TypeScript 如何基于对象键推导对应值的类型?
基于键值联动定义对象值类型的实现方案
原写法不合法的原因
普通对象的字符串索引签名存在天然限制:[Arg: string]仅用于统一描述所有字符串键的通用值类型,该位置的Arg只是索引规则的占位符,无法在同对象的值类型中捕获、引用每个键的具体字符串值——它不是绑定在单组键值对上的泛型,因此没法实现“键和对应函数参数类型绑定”的效果。
实现方式:使用映射类型
TypeScript 的映射类型会逐迭代遍历指定的键集合,每轮迭代都会把当前的具体键值绑定为泛型变量,天然支持键和对应值的类型联动,对应实现如下:
type Config<KeyCollection extends string = string> = { [CurrentKey in KeyCollection]: (arg: `Test-${CurrentKey}`) => void }
实际使用示例
- 当需要限定合法键的范围时,可传入具体的键联合类型,TS会自动为每个键匹配对应的函数参数类型约束:
// 限定Config的合法键仅为 'user' | 'goods' | 'order' type AppConfig = Config<'user' | 'goods' | 'order'> const demoConfig: AppConfig = { // 键为'user'时,入参自动约束为 'Test-user' 字面量类型 user: (arg) => { // TS自动推导 arg 类型为 'Test-user' console.log(arg) }, // 键为'goods'时,入参自动约束为 'Test-goods' 字面量类型 goods: (arg) => { // TS自动推导 arg 类型为 'Test-goods' }, // 键为'order'时,入参自动约束为 'Test-order' 字面量类型 order: (arg) => { // TS自动推导 arg 类型为 'Test-order' } }
- 当不需要限制具体键的取值范围、允许任意字符串作为键时,直接传入
string作为泛型参数即可,生成的类型完全覆盖初始需求。
约束效果验证
如果函数入参类型和当前键的规则不匹配,TS会直接抛出类型错误:
const invalidConfig: AppConfig = { // 类型报错:键为user时,入参必须为'Test-user' 字面量 user: (arg: 'Test-wrong') => {} }
内容的提问来源于stack exchange,提问作者Samuel Martineau
相关产品推荐
相关产品推荐

