打字稿映射类型

时间:2019-07-10 07:17:58

标签: typescript mapped-types

建议在显式部分类型上使用映射类型,请参见 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>;

因为我有一个生成的可创建部分接口的生成器,该接口由于使用鸭子输入而中断了类型检查。

2 个答案:

答案 0 :(得分:3)

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

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

Example on the playground。描述here

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

  

...从?的所有属性中剥离T修饰符,从而使所有属性成为必需。

所以:

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

Example on the playground

答案 1 :(得分:0)

如果您选中 https://www.typescriptlang.org/docs/handbook/utility-types.html,您可以看到 Typescript 提供了很多实用程序类型。所以请注意该实用程序尚未存在。您会发现 Required 最适合您的场景。

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