TypeScript类型检查类型而不是实例

时间:2017-01-30 13:51:13

标签: typescript typechecking

我希望能够将类型(而不是类型的实例)作为参数传递,但我想强制执行类型必须扩展特定基类型的规则

示例

abstract class Shape {
}

class Circle extends Shape {
}

class Rectangle extends Shape {
}

class NotAShape {
}

class ShapeMangler {
    public mangle(shape: Function): void {
        var _shape = new shape();
        // mangle the shape
    }
}

var mangler = new ShapeMangler();
mangler.mangle(Circle); // should be allowed.
mangler.mangle(NotAShape); // should not be allowed.

基本上我认为我需要将某些东西替换为shape: Function吗?

TypeScript可以实现吗?

注意:TypeScript还应该识别shape有一个默认构造函数。在C#中我会做这样的事情......

class ShapeMangler
{
    public void Mangle<T>() where T : new(), Shape
    {
        Shape shape = Activator.CreateInstance<T>();
        // mangle the shape
    }
}

1 个答案:

答案 0 :(得分:1)

有两种选择:

class ShapeMangler {
    public mangle<T extends typeof Shape>(shape: T): void {
        // mangle the shape
    }
}

或者

class ShapeMangler {
    public mangle<T extends Shape>(shape: { new(): T }): void {
        // mangle the shape
    }
}

但是这两个对编译器来说都没问题:

mangler.mangle(Circle);
mangler.mangle(NotAShape);

使用您发布的示例,因为您的类为空,并且空对象与结构中的每个其他对象匹配 如果添加属性,例如:

abstract class Shape {
    dummy: number;
}

然后:

mangler.mangle(NotAShape); // Error