【问题标题】:Typescript mapped types打字稿映射类型
【发布时间】:2019-11-19 18:21:02
【问题描述】:

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

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

【问题讨论】:

    标签: typescript mapped-types


    【解决方案1】:

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

    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&lt;T&gt;Required&lt;T&gt;...

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

    所以:

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

    Example on the playground.

    【讨论】:

    • 你知道这是在哪里记录的吗?我只是费力地单击了手册的每个单独部分并搜索了-?- ?。它们中的任何一个都不存在。我发现自己对 TypeScript 糟糕的文档感到沮丧,而不是第一次(第二次、第三次或第四次)。
    • @T.J.Crowder 文档?!这是打字稿。真正的打字稿开发人员阅读了所有 PR (github.com/Microsoft/TypeScript/pull/21919) 和所有问题(因为这是一份全职工作,所以不工作)。 ?
    • @T.J.Crowder 还有最新消息部分:typescriptlang.org/docs/handbook/release-notes/…
    • @TitianCernicova-Dragomir - 谢谢!现在,如果我是另一类人,我会删除我所有的 cmets 并将你的 cmets 标记为“不再需要”,然后发布一个新答案,说“是的,你可以使用 TypeScript 中的新 Required&lt;T&gt; 类型来做到这一点2.8。”好像我知道... ;-)
    • @T.J.Crowder wops 我总是忘记那个.. 我会把它添加到答案中,10x
    【解决方案2】:

    如果您检查https://www.typescriptlang.org/docs/handbook/utility-types.html,您会发现 Typescript 提供了很多实用程序类型。所以请确保实用程序不存在。您可以找到最适合您的场景的Required

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

    【讨论】:

      猜你喜欢
      • 2022-12-07
      • 2022-08-17
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      相关资源
      最近更新 更多