typescript - 在 Typescript 中,我可以创建强制需要属性的映射类型吗?

标签 typescript mapped-types

在 Typescript 中,我们有映射类型,可以将属性从一种类型映射到另一种类型。

一个常见的例子是 Partial 类型,它使泛型类型的所有属性都成为“可选”。

我想实现相反的效果,比如 Required,其中所有属性都是“必需的”,而不管它们的可选性如何。

Is such a thing possible?

(由于了解到我的问题很肤浅,请参阅更新!)

更新:

一些背景...

我正在学习映射类型,并受到文档 here 的启发

type Proxy<T> = {
    get(): T;
    set(value: T): void;
}
type Proxify<T> = {
    [P in keyof T]: Proxy<T[P]>;
}
function proxify<T>(o: T): Proxify<T> {
   // ... wrap proxies ...
}
let proxyProps = proxify(props);

我心里想,嗯,“我想知道我们能用这个搞什么恶作剧?”

所以我写了这样的东西:

type ProxyObservable<T> = Observable<T> & {
  [P in keyof T]: ProxyObservable<T[P]>;
};

这很酷,因为你可以给它这样的类型:

  interface Foo {
    myNum: number;
    myString: string;
    myObject: {
      someValue: number;
      anotherValue: Date;
    };
  }

然后你得到一个 ProxyObservable<Foo>类型,其中每个属性都是相同类型的 Observable,但也具有子属性(也是 Observable)的匹配导航属性。

const foo: ProxyObservable<Foo> = Proxify<Foo>(...)
foo.myNum.subscribe(...)
foo.myObject.subscribe(...)
foo.myObject.someValue.subscribe(...)

邪恶的,我知道。但是很酷。

当您将属性(例如 myObject)设为可选时,就会出现有趣的问题。然后 Typescript 将中断:

foo.myObject.someValue.subscribe(...)

因为它无法辨别与 Observable 联合的类型是“未定义”还是我们定义的对象。这就是我的问题所在。

但是......我现在也看到这不是“可选”属性的问题,而是一般的可区分联合类型的问题。

我意识到给定正确的上下文,Typescript 可能能够推断出 foo.myObject 的类型属性(property)。我尝试了一些变体:

foo.myObject!.someValue //<- Nope
foo.myObject ? foo.myObject.someValue : ... //<- Nope
if(foo.myObject) foo.myObject.someValue //<- Nope

在我看来,Typescript 编译器应该能够推断出这一点!

谁能告诉我为什么不呢?

最佳答案

从 TypeScript 2.8 开始,这成为可能并作为 Required 类型内置到 TypeScript 中。

http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html

这是它的定义:

/**
 * Make all properties in T required
 */
type Required<T> = {
    [P in keyof T]-?: T[P];
};

关于typescript - 在 Typescript 中,我可以创建强制需要属性的映射类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46623109/

相关文章:

javascript - typescript : 'string | undefined' 类型的参数不可分配给 'string' 类型的参数

javascript - 使用rxjs间隔时不调用观察者回调

node.js - 如何创建接受插件的 Node 项目

javascript - Angular5 Instascan - 打开相机不工作 <视频>

typescript - 为什么有时生成的文档中不显示 TSDoc 中最顶部的注释?

swagger - NestJS 映射类型 - 嵌套对象

typescript - 映射类型可以使属性成为可选的,但前提是满足条件?

javascript - 如何将某些参数映射为可选参数?

Typescript 将 null 替换为未定义的类型

typescript - 如何将对象键的类型限制为命名空间常量?