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

时间:2018-04-04 15:52:26

标签: typescript mapped-types

鉴于此代码:

select

我希望interface Foo{ one?: string; two?: string; } type Foo2 = { [P in keyof Foo]: number; } 的类型为Foo2但是,它似乎保留了可选修饰符{ one: number; two: number; }

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

3 个答案:

答案 0 :(得分:14)

在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>;

答案 1 :(得分:4)

您可以使用Required<T>代替-?

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

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

答案 2 :(得分:1)

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

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,你认为它很有趣:)