没有未定义的打字稿类型推断

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'] 的所有属性成为必需,而这不是这种情况所需要的。