Typescript: 将typeof与泛型一起使用

创建于 2017-12-15  ·  3评论  ·  资料来源: microsoft/TypeScript

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>; ),因为我并没有真正维护它们。

(似乎有多个相关问题,但我找不到与此问题完全相关的问题。)

Question

最有用的评论

“ 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());

所有3条评论

“ 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 )扩展而来的,所以我需要弄清楚如何在此应用您的反馈。 谢谢。

此页面是否有帮助?
0 / 5 - 0 等级