我有一个Dictionary类,我想做以下事情:
export class Dictionary<K, V> {
private table:{ [key: string]: IDictionaryPair<K, V> };
private nElements:number;
constructor(src:Dictionary<K, V>) {
for (var item in src.table)
if (src.hasOwnProperty(item)) {
windward.trap();
var valCopy = new V(src[<string>item]);
this.setValue(<K>item, valCopy);
}
}
}
除了“var valCopy = new V(src [item]);”之外,这一切都会很好用。不被允许。有没有办法做到这一点?因为如果类型V有一个复制构造函数,那么这一切都是有效的,包括类型检查。
有办法做到这一点吗?
谢谢 - 戴夫
答案 0 :(得分:1)
所有类型信息都在运行时被删除,因此您需要在运行时仍然存在的内容以便新建一个实例:
export class Dictionary<K, V> {
private table:{ [key: string]: IDictionaryPair<K, V> };
private nElements:number;
constructor(src:Dictionary<K, V>, myType: any) {
for (var item in src.table)
if (src.hasOwnProperty(item)) {
windward.trap();
var valCopy = <V> new myType(src[<string>item]);
this.setValue(<K>item, valCopy);
}
}
}
您甚至可以约束它,以便保证构造函数签名符合您的期望:
export interface MyNewable<T> {
new(input: string) : T;
}
export class Dictionary<K, V> {
private table:{ [key: string]: IDictionaryPair<K, V> };
private nElements:number;
constructor(src:Dictionary<K, V>, type: MyNewable<V>) {
for (var item in src.table)
if (src.hasOwnProperty(item)) {
windward.trap();
var valCopy = <V> new type(src[<string>item]);
this.setValue(<K>item, valCopy);
}
}
}
使用约束版本的示例(通过不传入src
简化)
export class MyClass {
constructor(input: string) {
}
}
export class Example {
constructor(input: number) {
}
}
var d = new Dictionary<string, MyClass>(null, MyClass);
// Complier warning - type `Example` isn't compatible.
var e = new Dictionary<string, MyClass>(null, Example);