没有未定义的打字稿类型推断
Typescript type inference without undefined
以下代码具有从用户推断出的OfficeDocument 类型,但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);
Required
将具有可选属性的 对象类型 转换为具有必需属性的对象类型。例如:
type User = {
id?: number;
}
type PopulatedUser = Required<User>;
// result:
// { id: number }
对不是对象的东西使用Required
不会有任何作用。如果要从联合中排除 undefined
,请使用 NonNullable
.
type OfficeDocument = {
userId: NonNullable<User['id']>;
}
您可以通过将 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']
的所有属性成为必需,而这不是这种情况所需要的。
以下代码具有从用户推断出的OfficeDocument 类型,但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);
Required
将具有可选属性的 对象类型 转换为具有必需属性的对象类型。例如:
type User = {
id?: number;
}
type PopulatedUser = Required<User>;
// result:
// { id: number }
对不是对象的东西使用Required
不会有任何作用。如果要从联合中排除 undefined
,请使用 NonNullable
.
type OfficeDocument = {
userId: NonNullable<User['id']>;
}
您可以通过将 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']
的所有属性成为必需,而这不是这种情况所需要的。