以下代码的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']>;
}