如何告知TypeScript某接口所有成员均不为undefined且无需重写接口
TypeScript复用原接口生成所有属性必选非undefined类型的方法
场景说明
已定义带可选属性的Person接口:
interface Person { name?: string; age?: number; gender?: string; }
需要在不完整重写接口的前提下,得到所有属性均为必选、值不会为undefined的等价类型,目标结构如下:
{ name: string; age: number; gender: string; }
实现方法
直接使用TypeScript内置的Required<T>工具类型即可,无需重复编写接口结构。Required<T>是TypeScript原生提供的工具类型,作用是移除传入类型T所有属性的可选修饰符?,将可选属性转为必选属性。针对当前定义的Person接口,Required<Person>的类型结构完全匹配需要的必选非undefined效果。
使用示例
// 基于原Person接口生成必选版本的类型 type RequiredPerson = Required<Person>; // 类型校验通过:所有属性必填,值不能为undefined const validPerson: RequiredPerson = { name: "Zhang San", age: 28, gender: "male" }; // 类型校验报错:缺少必填属性age、gender const invalidPerson1: RequiredPerson = { name: "Li Si" }; // 类型校验报错:gender不能赋值为undefined const invalidPerson2: RequiredPerson = { name: "Wang Wu", age: 32, gender: undefined };
扩展场景适配
如果原接口中存在显式声明为类型 | undefined的属性(不是可选修饰符带来的undefined),Required<T>不会移除属性本身联合的undefined类型,这种场景可以自定义一个工具类型,同时移除可选修饰符和属性上的undefined、null类型:
type StrictRequired<T> = { [K in keyof T]-?: NonNullable<T[K]> }
其中-?是移除可选修饰符的固定语法,NonNullable<T>是TS内置工具类型,用于排除类型中的null和undefined。
内容的提问来源于stack exchange,提问作者Nyi Nyi Hmue Aung
相关产品推荐
相关产品推荐

