You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');

问题修复方案

问题根源

  1. 泛型T仅设置了默认值为keyof GameOptions,但未明确约束其类型范围,导致TypeScript无法确认T可以安全索引Partial<GameOptions>。
  2. 返回值类型写死为所有属性类型的联合类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:55:20