Typescript 字符串文字参数作为编译时类型名
鉴于以下类型:Typescript 字符串文字参数作为编译时类型名,typescript,Typescript,鉴于以下类型: declare namespace Word { interface Application { } interface Document { Save(): void; } } 我可以按如下方式编写多个重载: interface ActiveXObject { new(progid: 'Word.Application'): Word.Application; new(progid: 'Word.Document'):
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');
您可以利用映射类型和查找类型。但是,您仍然需要一个用于查找的声明类型
声明名称空间单词{
接口应用程序{}
接口文件{
Save():void;
}
}
类型映射={
应用:Word.Application,
文档:Word.Document
}
接口ActiveXObject{
新(k:k):映射[k]
}
var doc=新的ActiveXObject(“文档”);
//此处编译错误--Word.Document没有此方法
doc.BadMethod();
若您可以定义名称空间单词来导出类,那个么您就有了更好的技巧
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
声明名称空间单词{
导出类应用程序{}
导出类文档{
Save():void;
}
}
接口ActiveXObject{
新的(k:k):(字的类型)[k]['prototype']
}
var doc=新的ActiveXObject(“文档”);
doc.BadMethod();//错误
doc.Save();//好啊
有趣的问题。相关/可能重复:和@Pac0这两个问题都涉及在运行时从字符串创建实例;我对编译时感兴趣。AFAICT,所有答案要么将结果转换为显式类型,要么只使用any
。是的,我没有标记你的帖子,也在阅读这些。恐怕没有你想要的优雅而简单的答案。不过,我不是专家,所以我不会把我的评论变成答案。我在考虑这一点,特别是因为我看到它在lib.d.ts
中用于createElement
签名。我必须使用接口而不是别名,因为这些映射可能分布在多个文件中,并且需要合并。(次要的一点——在我的特定场景中,名称空间还必须作为映射类型的键包含。)嗨@ZevSpitz,我想出了一个技巧,它甚至需要更少的重复。过来看。
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