TypeScript版本:当前游乐场版本(?)
码
class GenericGroup<T> {
items: Array<T> = [];
constructor(name: string) {}
}
type CheckboxValues = string;
type CheckboxesGroup = new (name: string) => GenericGroup<CheckboxValues>;
const Checkboxes: CheckboxesGroup = GenericGroup;
const checkboxes = new Checkboxes('checkboxes');
checkboxes.items.map(item => item.toUpperCase());
type RadioValues = string;
type RadiosGroup = typeof GenericGroup<RadioValues>;
const Radios: RadiosGroup = GenericGroup;
const radios = new Radios('radios');
radios.items.map(item => item.toUpperCase());
预期行为:
typeof GenericGroup<RadioValues>;
等效于new (name: string) => GenericGroup<RadioValues>;
实际行为:
语法错误,因为不支持typeof GenericGroup<RadioValues>;
。
动机:
在我的用例中,我有一个带有通用类的类(例如GenericGroup
),该类从第三方库中扩展了一个类。 第三方库中的类在其构造函数中使用多个参数。 当我用填充的泛型为我的类命名时,我不想每次都为第三方库编写参数(就像new (name: string) => GenericGroup<CheckboxValues>;
),因为我并没有真正维护它们。
(似乎有多个相关问题,但我找不到与此问题完全相关的问题。)
“ typeof”运算符不是要描述类型的构造函数,而是要描述值的类型。 一些通用
interface MyInterface {
name: string;
}
let m: typeof MyInterface; // error "MyInterface only refers to a type, but is being used as a value here."
解决方案是定义一个通用类型来描述Angular那样的构造函数:
// angular/packages/core/src/type.ts
export interface Type<T> extends Function {
new (...args: any[]): T;
}
来自( angular / packages / core / src / type.ts )
用法示例:
type RadioValues = string;
type RadiosGroup = Type<GenericGroup<RadioValues>>;
const Radios: RadiosGroup = GenericGroup;
const radios = new Radios('radios');
radios.items.map(item => item.toUpperCase());
一个细微的事情是泛型类构造函数不包含在泛型类型中。 您可以知道,因为type参数不在静态成员的范围内! 感觉像您有这样的类型
interface GenericCtor<T> {
new(x: string): InstanceType<T>;
}
但真正的类型是这样的
interface GenericCtor {
new<T>(x: string): InstanceType<T>;
}
谢谢你们俩。 我需要把头包起来。 就我而言,我是从第3方构造函数( React.Component
)扩展而来的,所以我需要弄清楚如何在此应用您的反馈。 谢谢。
最有用的评论
“ typeof”运算符不是要描述类型的构造函数,而是要描述值的类型。 一些通用不是值,它本身就是类型。 任何其他接口/类型(如下面定义的接口/类型)也不会以这种方式工作。
解决方案是定义一个通用类型来描述Angular那样的构造函数:
来自( angular / packages / core / src / type.ts )
用法示例: