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

Mapped Types: removing optional modifier

鉴于此代码:

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

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

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

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

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

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

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

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

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

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,您会觉得有趣:)

从 typescript 2.8 开始你基本上可以使用 Required utility type

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

type Foo2 = Required<Foo>

utilit types

在这种情况下,即使 'one' 和 'two' 是不同的类型,您也不必担心