Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 字符串文字参数作为编译时类型名_Typescript - Fatal编程技术网

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