如何将“null”添加到接口的每个字段?
我有一个这样的界面:
interface TrainingSession {
date: string;
topic: string;
}
我想创建一个表单,它将向我的 API 发送一个 /createTrainingSession 请求。在这种形式中,我想使用上面的界面来键入保存用户输入的数据结构。喜欢:
const initialFormInput : TrainingSession = {
date: null,
topic: null
}
问题是,由于初始接口在两个字段中都需要一个字符串,因此我无法传递到null那里。想到的一种解决方案是null像这样扩展接口:
interface FormTrainingSession extends TrainingSession {
date: string | null;
topic: string | null;
}
但这有点烦人 - 从头开始重写界面只是为了添加 null?
我喜欢如何Partial<TrainingSession>工作,但显然 Partial 添加| undefined到每个领域,而不是我想要的 - | null。是否有一个等价的 Partial,只是增加了 | 空值?
回答
有趣的是,如果您Partial在 VS Code 中按 CTRL+单击(实用程序类型包含在 TS 本身中),您将看到:
/**
* Make all properties in T optional
*/
type Partial<T> = {
[P in keyof T]?: T[P];
};
受上述启发......
要创建一个添加| null到每个字段的泛型类型,只需执行以下操作:
export type PartialNull<T> = {
[P in keyof T]: T[P] | null;
};
两者的区别在于:
- 缺少
?inPartialNull-?附加| undefiend到现有类型,从而使字段可选 -| null添加而不是?. - 类型名称(显然,因为 Partial 已经存在)
要使用新的 PartialNull 类型,在你要使用的 .ts 文件中导入,然后写
const formData : PartialNull<TrainingSession> = {
date: null,
name: null
}