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

24

考虑以下代码:

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

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

我本以为Foo2的类型是{ one: number; two: number; },然而它似乎仍保留了可选修饰符{ one?: number; two?: number; }

在使用映射类型时是否有可能去掉可选修饰符?

4个回答

39
在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
2
从添加它们的 PR https://github.com/Microsoft/TypeScript/pull/21919 中。 - Titian Cernicova-Dragomir
https://www.typescriptlang.org/docs/handbook/utility-types.html#requiredtype - C0ZEN

19

你可以使用 Required<T> 作为 -? 的替代选择。

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

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

2
我会建立自己的实用程序。
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>;

我写了一篇关于映射类型的中等难度文章,你可能会发现它很有趣:这里


0

自 TypeScript 2.8 版本以来,您基本上可以使用 Required 实用程序类型。

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

type Foo2 = Required<Foo>

实用类型

在这种情况下,即使“one”和“two”是不同的类型,你也不需要担心它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接