Я использую условные типы для автоматического определения типа структуры данных с помощью универсальных классов. По какой-то причине он не выводит типы в конструкторе ObjectType
.
export type NodeType<T> = T extends (infer U)[] ? ArrayNode<U> : ObjectNode<T>
export abstract class Node {}
export class ObjectNode<T> extends Node {
constructor(public fields: { [key in keyof T]: Field<NodeType<T[key]>> }) {
super()
}
public data: T
}
export class ArrayNode<T> extends Node {
public data: T[]
constructor(public ofType: NodeType<T>) {
super()
}
}
class Field<T extends Node> {
constructor(public node: T) {}
}
const User = new ObjectNode({})
const query = new ObjectNode({
user: new Field(User),
// ****************
/// The below `users` field should be automatically be detected as 'Field<ArrayNode<{}>>', but for some reason it's 'Field<ObjectNode<{}>>'.
/// Property 'fields' is missing in type 'ArrayNode<{}>' but required in type 'ObjectNode<{}>'.
// ****************
users: new Field(new ArrayNode(User))
})
var q: ObjectNode<{ users: {}; user: {} }>
q.fields.users.node.fields
q.fields.user.node.fields
q.data.user
q.data.users
query.fields.users.node.fields
query.fields.user.node.fields
query.data.user
query.data.users