我正在尝试让编译器帮助我验证通过网络接收的有效负载。因此,我想做的是通过线路获取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
的情况下使所有这些工作吗?
答案 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>;