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>([]);
类似例子:
const set = new Set([]) // Set<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>([]);
类似例子:
const set = new Set([]) // Set<never>