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

如何解决TypeScript中extends类型的映射返回问题?

实现基于布尔状态的OptionBuilder类

需求是实现一个OptionBuilder类,根据构造函数传入的布尔值区分两种状态:

  • 当构造参数为true时,or方法返回实例本身(this)
  • 当构造参数为false时,or方法返回传入的参数值

以下是经过类型修复后的完整实现代码:

// 映射类型:根据布尔值选择对应的类型
type MappedType<IsTrue extends boolean, TrueType, FalseType> = { true: TrueType; false: FalseType }[`${IsTrue}`];

// 辅助函数:根据布尔值返回对应的值,并保留类型信息
function asMapped<IsTrue extends boolean, TrueType, FalseType>(isTrue: IsTrue, trueValue: TrueType, falseValue: FalseType): MappedType<IsTrue, TrueType, FalseType> {
  return { true: trueValue, false: falseValue }[`${isTrue}`];
}

class OptionBuilder<IsTrue extends boolean, SomeType = unknown> {
  #isTrue: IsTrue;
  #value: SomeType;

  constructor(isTrue: IsTrue, someType: SomeType) {
    this.#isTrue = isTrue;
    this.#value = someType;
  }

  // 根据实例的布尔状态决定返回值类型
  or<ValueType>(value: ValueType): MappedType<IsTrue, this, ValueType> {
    return asMapped<IsTrue, this, ValueType>(this.#isTrue, this, value);
  }
}

// 示例使用
const ex1 = new OptionBuilder(false, undefined);
const ex2 = new OptionBuilder(true, 'value');

// ex3 类型为 string(因为ex1的isTrue为false,or返回传入的"hello")
const ex3 = ex1.or("hello")
// ex4 类型为 OptionBuilder<true, string>(因为ex2的isTrue为true,or返回实例本身)
const ex4 = ex2.or("hello")

代码说明

  • MappedType:条件映射类型,通过布尔值的字符串索引从对象中选择对应类型,实现根据布尔状态区分返回类型的效果。
  • asMapped:辅助函数,运行时根据布尔值返回对应的值,同时通过泛型保留类型信息,让TypeScript能正确推断返回值类型。
  • OptionBuilder类:
    • 私有属性#isTrue存储构造时传入的布尔状态,#value存储对应的值
    • or方法调用asMapped,根据实例的布尔状态决定返回this还是传入的参数,类型系统会自动推断正确的返回类型

内容的提问来源于stack exchange,提问作者Manda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:56:01