使用等于undefined的泛型时,如何避免显式赋值undefined?
解决TypeScript泛型T为undefined时的字段必填问题
可以通过条件类型实现需求:当泛型T为undefined时,让接口属性变为可选;当T为其他类型时,保持属性必填约束。
改写后的代码如下:
type Options<T> = T extends undefined ? { a?: T; b?: T } : { a: T; b: T }; function execute<T>(options: Options<T>): void { // do something } // 以下调用均正常工作 execute<undefined>({ a: undefined, b: undefined }); execute<undefined>({}); // 其他类型仍保留原有必填约束 execute<string>({ a: "foo", b: "bar" }); // 无错误 execute<string>({}); // 编译错误:缺少'a'和'b'
原理说明
- 借助TypeScript条件类型
T extends undefined ? X : Y,根据T的类型动态生成对应的接口结构 - 当
T等于undefined时,生成的接口中a和b为可选属性(带?标记),因此空对象{}会被类型检查认可 - 当
T为其他类型时,接口维持原有必填属性的规则,保证类型约束的严谨性
内容的提问来源于stack exchange,提问作者cat_in_hat
相关产品推荐
相关产品推荐

