TypeScript Class 泛型实例从不推断

TypeScript Class Generics instance infer never

interface TreeRaw {
  ID: string;
  parentID: string;
  seq: number;
  [props: string]: any;
}

class Tree<T extends TreeRaw = TreeRaw> {
  data: T[];

  constructor(rawData: T[]) {
    this.data = rawData;
}

const tree = new Tree([]);

tree infer Tree

为什么实例树推断 Tree<never> 而不是 Tree<TreeRaw>

当我不输入泛型时,我能做些什么来获得实例推断 Tree<TreeRaw>

可能是因为无法将空数组 ([]) 推断为 TreeRaw[]

这个会正确推断的

const tree = new Tree([] as TreeRaw[]);

因为默认情况下总是将空数组推断为 never[]。这是因为 TS 不知道你想要的是数字数组还是字符串数组还是任何其他数组类型。

如果你想正确地推断它,你应该提供明确的泛型参数。

interface TreeRaw {
    ID: string;
    parentID: string;
    seq: number;
    [props: string]: any;
}

class Tree<T extends TreeRaw = TreeRaw> {
    data: T[];

    constructor(rawData: T[]) {
        this.data = rawData;
    }
}

// explicit generic argument
const tree = new Tree<TreeRaw>([]);

Playground

类似例子:

const set = new Set([]) // Set<never>