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

NSj*_*nas 9 typescript mapped-types

鉴于此代码:

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

type Foo2 = {
  [P in keyof Foo]: number;
}
Run Code Online (Sandbox Code Playgroud)

我希望类型Foo2{ one: number; two: number; } 但是,它似乎保持可选修饰符{ one?: number; two?: number; }

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

Tit*_*mir 17

在Typescript 2.8中,您可以明确地消除修饰符:

type Foo2 = {
  [P in keyof Foo]-?: number;
}
Run Code Online (Sandbox Code Playgroud)

或者使用Required内置于较新版本的类型.

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

type Helper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P] };
type Foo3 = Helper<Foo, keyof Foo>;
Run Code Online (Sandbox Code Playgroud)

  • @tamj0rd2 来自添加它们的 PR https://github.com/Microsoft/TypeScript/pull/21919 (2认同)

iar*_*oyo 5

您可以Required<T>替代-?

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

type Foo2 = {
  [P in keyof Required<Foo>]: number;
};
Run Code Online (Sandbox Code Playgroud)