如何解决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
相关产品推荐
相关产品推荐

