网站搜索

TypeScript 映射类型


建议使用映射类型而不是显式的部分类型,请参阅 https://www.typescriptlang.org/docs/handbook/advanced-types.html#mapped-types

即而不是

interface PersonPartial {
    name?: string;
    age?: number;
}

我们会使用

interface Person {
    name: string;
    age: number;
}
type Partial<T> = {
    [P in keyof T]?: T[P];
}
type PersonPartial = Partial<Person>;

是否有可能映射到另一个方向,类似于

type NotPartial<T> = {
    [P in keyof T]!: T[P];
}
type Person = NotPartial<PersonPartial>;

因为我有一个生成器,它会创建部分接口,这会由于鸭子类型而破坏我的类型检查。

答案#1

你可以使用 -? 语法从同态映射类型中移除 ? (但请继续阅读):

interface Person {
    name?: string;
    age?: number;
}
type Mandatory<T> = {
    [P in keyof T]-?: T[P];
}
type PersonMandatory = Mandatory<Person>;

游乐场上的例子。这里有描述。

但是, 你不必这样做,因为 TypeScript 已经有它了: Required<T>。Required<T>...

...从 T 的所有属性中去除 ? 修饰符,从而使所有属性都为必需。

所以:

interface Person {
    name?: string;
    age?: number;
}
type RequiredPerson = Required<Person>;

操场上的例子。

答案#2

如果你查看 https://www.typescriptlang.org/docs/handbook/utility-types.html,你会发现 TypeScript 提供了很多实用类型。因此请确认该实用工具尚未存在。你会发现 Required 最适合你的场景。

如果你想了解更多,我在这里写了一篇关于映射类型的文章