如何引用属性的类型?

Dou*_*los 2 typescript

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

例:

给定类型:

interface Person {
  name: string;
  address: Address
}

interface Address {
  street: string;
  country: string;
}
Run Code Online (Sandbox Code Playgroud)

Projection<Person>会是:

const p: Projection<Person> = { // this is a Projection<Person>
  name: 1,
  address: { // this is a Projection<Address>
    street: 0,
    country: 1
  }
}
Run Code Online (Sandbox Code Playgroud)

打字稿有可能吗?我陷入了递归投影部分

export type Projection<T> = { [K in keyof T]?: number | Projection<???> };
Run Code Online (Sandbox Code Playgroud)

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

Mu-*_*sai 5

我相信你在找什么

type Projection<T> = { [K in keyof T]: number | Projection<T[K]> };
Run Code Online (Sandbox Code Playgroud)

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

type Projection<T> = { [K in keyof T]: T[K] extends string ? number : Projection<T[K]> };
Run Code Online (Sandbox Code Playgroud)

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

type Projection<T> = { [K in keyof T]: T[K] extends object ? Projection<T[K]> : number };
Run Code Online (Sandbox Code Playgroud)