如何将TypeScript函数参数类型设置为某类型的属性key?是否可行?
第一个问题:限定函数参数仅接受指定类型的属性key
该需求完全可以实现,使用TypeScript内置的keyof操作符即可。keyof T会返回类型T所有属性名组成的联合类型,直接把它作为参数类型就能满足约束。
修正后的示例代码如下:
type A = { prop1: string; prop2: boolean; } // arg的类型自动推导为 'prop1' | 'prop2' const example = (arg: keyof A ) => {} // 效果验证 example('prop1') // 类型合法 example('prop2') // 类型合法 example('prop3') // 类型校验报错,不存在该属性
第二个问题:声明类似enum逻辑的对象类型
有两种常用实现方案,可根据场景选择:
方案1:直接使用enum(你给出的示例本身就是合法可用的)
TypeScript原生支持将enum成员作为对象的键类型,你写的代码可以直接运行:
enum Enum { bold = 'bold', italic = 'italic', } const objWithEnumProperties: {[key in Enum]: any} = { [Enum.bold]: '', [Enum.italic]: '' }
该方案的特点是enum会被编译为实际存在的JavaScript对象,适合运行时需要用到枚举取值的场景。
方案2:使用字面量联合类型+Record工具类型
如果你只需要做类型约束,不需要运行时的枚举实体,可以用更轻量的方案,不会产生额外的JS代码:
// 定义键的字面量联合类型 type FontStyle = 'bold' | 'italic' // Record<键类型, 值类型>是TS内置快捷工具类型,等价于 {[key in FontStyle]: any} const objWithUnionProperties: Record<FontStyle, any> = { bold: '', italic: '' }
内容的提问来源于stack exchange,提问作者Scott S
相关产品推荐
相关产品推荐

