什么类型的构造函数?

时间:2014-11-06 10:39:05

标签: typescript

我正在构建的打字稿应用程序中有这些内容。

class Thing {
    static ReleventInfo: string
}
class Foo extends Thing { }
class Bar extends Thing { }
class Baz extends Thing { }

var things = {
    foo: Foo,
    bar: Bar,
    baz: Baz,
}


function FooPlease(): Foo {
    return new things.foo;
}

function ThingPlease(thing: string): Thing {
    if (!things[thing])
        return null;
    var ctor = things[thing];
    // ctor now has type of 'any', can't access 'ReventInfo' nicely.
    var newThing = new ctor();
    // newThing now has type of 'any'
    return newThing;
}

哪个有效,但是typescript(和Intellisense)会忘记ctor的类型,因此会newthing,这是一个问题,因为我希望访问静态属性和它们上的对象方法。  我应该说var是什么类型的? Intellisense无益提供此信息: (var) things = { foo: typeof(Foo) } (class) Foo

2 个答案:

答案 0 :(得分:1)

因为TypeScript无法知道哪些字符串可能传递给ThingPlease,所以无法确定类型。

你需要使用类型断言给它一个提示:

var ctor = <typeof Thing>things[thing];

以下完整示例:

class Thing {
    static ReleventInfo: string
}

class Foo extends Thing { }
class Bar extends Thing { }
class Baz extends Thing { }

var things = {
    foo: Foo,
    bar: Bar,
    baz: Baz,
}


function FooPlease(): Foo {
    return new things.foo;
}

function ThingPlease(thing: string): Thing {
    if (!things[thing]) {
        return null;
    }

    // ctor is `typeof Thing`
    var ctor = <typeof Thing>things[thing];

    // newThing is `Thing`
    var newThing = new ctor();

    return newThing;
}

答案 1 :(得分:1)

根据Steve的回答,我意识到我可以使用地图类型{ [thingType: string]: typeof Thing }来定义地图,而不是将其隐含 - 这会导致所有访问返回typeof Thing而不进行强制转换!

class Thing {
    static ReleventInfo: string
}
class Foo extends Thing { }
class Bar extends Thing { }
class Baz extends Thing { }

var things: { [thingType: string]: typeof Thing } = {
    foo: Foo,
    bar: Bar,
    baz: Baz,
}


function FooPlease(): Foo {
    return new things.foo;
}

function ThingPlease(thing: string): Thing {
    if (!things[thing])
        return null;
    var ctor = things[thing];
    var newThing = new ctor();
    return newThing;
}