没有未定义的Typescript类型推理



以下代码的OfficeDocument类型是从User推断的,但userId应该是数字,没有未定义。必填项不起作用。

我该怎么做?例如,我想在调用handleDocument函数时得到一个关于不正确类型的错误。

type User = {
id: number | undefined;
}
type OfficeDocument = {
userId: Required<User['id']>;
}
const handleDocument = (document: Required<OfficeDocument>)  => {
console.log(document);
}
const user: User = {id: 10};
const officeDocument: OfficeDocument = {userId: undefined};
handleDocument(officeDocument);

您可以通过使id可选来修复它:

type User = {
id?: number
};
type OfficeDocument = {
userId: Required<User>['id']
};
const handleDocument = (document: OfficeDocument)  => {
console.log(document);
}
const user: User = {id: 10}; // Works
const officeDocument: OfficeDocument = {userId: undefined}; // Error: Type 'undefined' is not assignable to type 'number'
handleDocument(officeDocument);

然后,Required<>删除可选项,并强制OfficeDocument.userId为数字。

Required<User>['id']是必需的,因为它检索Required<User>的类型,这使得User上的所有属性都是必需的。另一方面,Required<User['id']>使得User['id']的所有属性都是必需的,而这不是这种情况所需要的。

Required将具有可选属性的对象类型转换为具有必需属性的对象类型。例如:

type User = {
id?: number;
}
type PopulatedUser = Required<User>;
// result:
// { id: number }

在非对象上使用Required不会有任何作用。如果要从并集中排除undefined,请使用NonNullable

type OfficeDocument = {
userId: NonNullable<User['id']>;
}

最新更新