如何引用属性的类型?

时间:2019-07-01 09:16:58

标签: typescript

我想创建一个类型为Projection<T>的对象,该对象的属性只能是number(0或1)或该属性类型的Projection。

示例:

给定类型:

interface Person {
  name: string;
  address: Address
}

interface Address {
  street: string;
  country: string;
}

Projection<Person>将是:

const p: Projection<Person> = { // this is a Projection<Person>
  name: 1,
  address: { // this is a Projection<Address>
    street: 0,
    country: 1
  }
}

打字稿完全可以吗?我陷入了递归投影部分

export type Projection<T> = { [K in keyof T]?: number | Projection<???> };

使用number | Projection<any>是可行的,但是当然不会检查声明的字段是否属于Address

1 个答案:

答案 0 :(得分:5)

我相信您正在寻找的是

type Projection<T> = { [K in keyof T]: number | Projection<T[K]> };

此外,如果原始结构中的字段始终是字符串,则可以通过编写以下内容使其更加具体:

type Projection<T> = { [K in keyof T]: T[K] extends string ? number : Projection<T[K]> };

如果这些字段并非总是字符串,则可以尝试:

type Projection<T> = { [K in keyof T]: T[K] extends object ? Projection<T[K]> : number };