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

如何告知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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:06:19