字符串文字参数为编译时类型名称

时间:2017-08-29 07:46:11

标签: typescript

考虑以下类型:

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');

1 个答案:

答案 0 :(得分:3)

您可以利用映射类型和查找类型。但是,您仍然需要声明一个类型以便查找。

link

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