如何在泛型类型为undefined时将属性设为可选?
解决方案
你可以通过条件类型结合交叉类型实现这个需求,根据泛型参数是否为undefined动态决定属性的可选性:
type Data<A = undefined, B = undefined> = (A extends undefined ? { a?: A } : { a: A }) & (B extends undefined ? { b?: B } : { b: B });
原理说明
- 当泛型参数
A等于undefined时,生成{ a?: A },属性a变为可选; - 当
A是其他类型时,生成{ a: A },属性a保持必填; - 同理处理泛型参数
B,最后通过交叉类型&将两个条件结果合并为最终类型。
测试验证
按你的测试用例验证:
// ✅ 编译通过:A为undefined,a可选,仅需提供必填的b const test1: Data<undefined, string> = { b: 'B' }; // ❌ 编译报错:B为string(非undefined),b是必填项,未提供会报错 const test2: Data<number, string> = { a: 1 }; // ✅ 编译通过:A和B均非undefined,a和b都必填且已提供 const test3: Data<number, string> = { a: 1, b: 'B' };
这种写法逻辑清晰,能准确匹配你需要的类型约束。
内容的提问来源于stack exchange,提问作者devklick
相关产品推荐
相关产品推荐

