寻求打字稿类型定义new + callable澄清

时间:2016-08-18 13:29:07

标签: typescript

我的问题来自于尝试将TypeScript类型定义.d.ts添加到第三方库。请记住,我不控制这个库,我只是尝试使用它并安抚tsc编译器。

在此阅读指南re:撰写d.ts个文件:

https://typescript.codeplex.com/wikipage?title=Writing%20Definition%20%28.d.ts%29%20Files

我正在看这个具体的例子:新的+可调用的方法

此处,文档显示以下模式:

interface Widget {
    sprock(): void;
}

interface WidgetFactory {
    new(name: string): Widget;
    (width: number, height: number): Widget;
}

declare var widget: WidgetFactory;

在此基础上,我根据自己的需求创建了以下内容:

declare module "react-localization" {
    interface LocalizedStringsMethods {
        setLanguage(language: string): void;
        getLanguage(): string;
        getInterfaceLanguage(): string;
        formatString(str: string, ...values: any[]): string
        getAvailableLanguages(): string[]
    }

    interface LocalizedStringsFactory {
        new (props: any): LocalizedStringsMethods;
    }

    var LocalizedStrings: LocalizedStringsFactory;

    export default LocalizedStrings;
}

这里值得注意的例外是文档版本不使用declare module。除此之外,就我而言,这些应该是相同的产量,类似的结果;我显然遗漏了一些东西。我得到了以下错误:

错误TS2351:无法使用' new'表达式缺少调用或构造签名的表达式。

我可以将我的定义更改为:

declare module "react-localization" {
    var LocalizedStrings: any;
    export = LocalizedStrings;
}

错误现在消失了,但我丢失了所有精彩的类型信息。 =,(

我不知所措。这到底出错了什么?

好的是加入这个谜团,我尝试在更全面的示例中使用export =而不是export default

declare module "react-localization" {
    interface LocalizedStringsMethods {
        setLanguage(language: string): void;
        getLanguage(): string;
        getInterfaceLanguage(): string;
        formatString(str: string, ...values: any[]): string
        getAvailableLanguages(): string[]
    }

    interface LocalizedStringsFactory {
        new (props: any): LocalizedStringsMethods;
    }

    var LocalizedStrings: LocalizedStringsFactory;

    export = LocalizedStrings; // <----- HERE instead of export default
}

有人可以向我解释为什么会这样,但export default最终会返回undefined吗?另外,我必须像下载这样导入:

import * as LocalizedStrings from 'react-localization'我更喜欢以import LocalizedStrings from 'react-localization进行导入。在这一点上,我会和前者一起生活,我只是想明白为什么。

1 个答案:

答案 0 :(得分:0)

解决方案是:

react-localization.d.ts

declare module "react-localization" {
    interface LocalizedStringsMethods {
        setLanguage(language: string): void;
        getLanguage(): string;
        getInterfaceLanguage(): string;
        formatString(str: string, ...values: any[]): string
        getAvailableLanguages(): string[]
    }

    interface LocalizedStringsFactory {
        new (props: any): LocalizedStringsMethods;
    }

    var LocalizedStrings: LocalizedStringsFactory;

    export default LocalizedStrings;
}

yourFile.ts

import LocalizedStrings from 'react-localization';

var x = new LocalizedStrings(123);

如果您想使用export =,则应使用import = require()https://www.typescriptlang.org/docs/handbook/modules.html

中的更多详细信息