TypeScript中如何根据动态参数获取对应接口属性的返回类型?
TypeScript中实现动态获取接口属性对应类型的方法
我想要实现一个方法,传入接口的属性名作为参数,返回该属性对应的类型。查了相关方案后发现大多基于字符串字面量,但我没法提前知道传入的参数值。自己写的代码出现两个错误:
- 错误1:
Type 'T' cannot be used to index type 'Partial<GameOptions>' - 错误2:调用
get('production')时,返回的联合类型无法赋值给boolean类型
原代码示例
interface GameOptions { production: boolean; background: string; stats?: boolean; objects?: new() => object } export class MyClass { // 通过另一个类构造函数中的方法设置 #options: Partial<GameOptions> = {}; get<T = keyof GameOptions>(option: T): GameOptions[keyof GameOptions] { return this.#options[option]; } }
调用代码
this.#production = this.gameConfig.get('production');
问题修复方案
问题根源
- 泛型
T仅设置了默认值为keyof GameOptions,但未明确约束其类型范围,导致TypeScript无法确认T可以安全索引Partial<GameOptions>。 - 返回值类型写死为所有属性类型的联合类型
GameOptions[keyof GameOptions],无法匹配单个属性的具体类型。
修复后的代码
interface GameOptions { production: boolean; background: string; stats?: boolean; objects?: new() => object } export class MyClass { #options: Partial<GameOptions> = {}; // 明确约束T为keyof GameOptions,返回对应属性的具体类型(包含undefined,因为是Partial) get<T extends keyof GameOptions>(option: T): GameOptions[T] | undefined { return this.#options[option] as GameOptions[T] | undefined; } }
调用处理
修复后调用get('production')会返回boolean | undefined类型(因为Partial类型的属性可能未被初始化),可以根据实际情况处理:
// 确定属性已被设置时,使用非空断言 this.#production = this.gameConfig.get('production')!; // 不确定属性是否存在时,做空值判断 const productionOpt = this.gameConfig.get('production'); if (productionOpt !== undefined) { this.#production = productionOpt; }
内容的提问来源于stack exchange,提问作者Get Off My Lawn
相关产品推荐
相关产品推荐

