我想创建一个类型为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
答案 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 };