考虑以下类型:
declare namespace Word {
interface Application { }
interface Document {
Save(): void;
}
}
我可以编写多个重载,如下所示:
interface ActiveXObject {
new(progid: 'Word.Application'): Word.Application;
new(progid: 'Word.Document'): Word.Document;
}
取各种字符串文字并返回相应的类型。因此,以下内容无法编译:
var doc = new ActiveXObject('Word.Document');
//compilation error here -- Word.Document doesn't have this method
doc.BadMethod();
是否可以编写单个重载,其返回类型是字符串文字引用的类型?
类似的东西:
interface ActiveXObject {
new(progid: string): typefrom(progid);
}
并且编译器将标记为无法识别的类型:
var nonexistentType = new ActiveXObject('Word.NonexistentType');
答案 0 :(得分:3)
您可以利用映射类型和查找类型。但是,您仍然需要声明一个类型以便查找。
declare namespace Word {
interface Application { }
interface Document {
Save(): void;
}
}
type Mapping = {
Application: Word.Application,
Document: Word.Document
}
interface ActiveXObject {
new<K extends keyof Mapping>(k: K): Mapping[K]
}
var doc = new ActiveXObject('Document');
//compilation error here -- Word.Document doesn't have this method
doc.BadMethod();
如果您可以将命名空间Word定义为导出类,那么您甚至可以获得更好的技巧。
declare namespace Word {
export class Application { }
export class Document {
Save(): void;
}
}
interface ActiveXObject {
new<K extends keyof typeof Word>(k: K): (typeof Word)[K]['prototype']
}
var doc = new ActiveXObject('Document');
doc.BadMethod(); // error
doc.Save(); // ok