严格验证可为空的字段

时间:2018-11-26 21:17:31

标签: typescript type-conversion nullable non-nullable typescript-types

我正在尝试让编译器帮助我验证通过网络接收的有效负载。因此,我想做的是通过线路获取JSON有效负载,并确保编译器在未设置所有字段的情况下会抱怨。我知道做到这一点的方法是使用验证函数,但是即使在进入验证部分之前,我也需要生成一些样板,将具有可空字段的类型转换为具有严格字段的​​类型。因此验证功能必须具有以下签名

type Validator<T> = (i: T) => Strictify<T>;

问题是我不知道如何使Strictify真正起作用。当我写以下内容时不起作用

type Strictify<T> = {
  [K in keyof T]: Exclude<T[K], undefined>
};
type Test = { k?: string };
type StrictTest = Strictify<Test>;

StrictTest的类型应为{ k: string },但实际上仍为{ k?: string }。有趣的部分是,如果我将Test的定义更改为{ k: string | undefined },那么它将起作用。我希望它是严格类型。有人知道如何在不将每个k?: T扩展到k: T | undefined的情况下使所有这些工作吗?

1 个答案:

答案 0 :(得分:1)

如果将字段类型声明为string|undefined,则您的版本将适用。尽管在strictNullChecks下,可选字段显示为具有string|undefined类型,但它们不是同一回事,但可选性是该字段的属性。

要在使用同态映射类型时从字段中删除可选修饰符(从Typescript 2.8开始),可以将-?添加到该类型:

type Strictify<T> = {
  [K in keyof T]-?: Exclude<T[K], undefined>
};
type Test = { k?: string };
type StrictTest = Strictify<Test>;