映射类型:删除可选修饰符

Posted

技术标签:

【中文标题】映射类型:删除可选修饰符【英文标题】:Mapped Types: removing optional modifier 【发布时间】:2018-09-14 06:37:25 【问题描述】:

鉴于此代码:

interface Foo
  one?: string;
  two?: string;


type Foo2 = 
  [P in keyof Foo]: number;

我希望Foo2 的类型为 one: number; two: number; 但是,它似乎保留了可选修饰符 one?: number; two?: number;

使用映射类型时是否可以删除可选修饰符?

【问题讨论】:

【参考方案1】:

在 Typescript 2.8 中,您可以显式消除修饰符:

type Foo2 = 
  [P in keyof Foo]-?: number;

或使用较新版本中内置的Required 类型。

如果您使用的是旧版本,则可以使用此解决方法:

type Helper<T, TNames extends string> =  [P in TNames]: (T &  [name: string]: never )[P] ;
type Foo3 = Helper<Foo, keyof Foo>;

【讨论】:

您是从哪里得知这件事的?我在文档中找不到它。我已经看到使用 -readonly 完成了类似的操作,我正在尝试阅读更多相关信息 @tamj0rd2 来自添加他们的 PR github.com/Microsoft/TypeScript/pull/21919 typescriptlang.org/docs/handbook/…【参考方案2】:

您可以使用Required&lt;T&gt; 替代-?

interface Foo 
  one?: string;
  two?: string;


type Foo2 = 
  [P in keyof Required<Foo>]: number;
;

【讨论】:

【参考方案3】:

我可能会建立自己的实用程序

interface Foo 
  one?: string;
  two?: string;


type RequiredWithType<T, V> = 
  [P in keyof T]-?: V;


// and then just use it
type Foo2 = RequiredWithType<Foo, Number>;

我已经建立了一篇关于映射类型的中型文章 here,您会觉得它们很有趣 :)

【讨论】:

以上是关于映射类型:删除可选修饰符的主要内容,如果未能解决你的问题,请参考以下文章

Angular 无法编译 Typescript 的映射类型修饰符

访问修饰符与可选修饰符static的使用

C#类详解

static可选修饰符

正则表达式修饰符 - 可选标志

Uni-App方向:侦听器、事件修饰符及事件映射表