我正在构建的打字稿应用程序中有这些内容。
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无益提供此信息:
答案 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;
}