映射类型:删除可选修饰符
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<T>
替代-?
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,您会觉得它们很有趣 :)
【讨论】:
以上是关于映射类型:删除可选修饰符的主要内容,如果未能解决你的问题,请参考以下文章