【问题标题】:How to create a Typescript declaration file for a custom class without require/import/export如何在没有 require/import/export 的情况下为自定义类创建 Typescript 声明文件
【发布时间】:2017-03-10 22:25:07
【问题描述】:

希望有人可以帮助我了解 typescript 声明文件以及如何访问我的自定义类。

假设我有一个自定义类来显示警报消息作为示例:

CustomAlert.ts:

/// <reference path="typings/CustomAlert.d.ts" />
module MdlCustomAlerts{    
    class CustomAlert{
        constructor(alertMessage:string, alertOptions:IAlertOptions){
            alert(message);
        }
    }
}

CustomAlert.d.ts

declare module MdlCustomAlerts{
    interface IAlertOptions{

    }

    class CustomAlert{
      constructor(alertMessage:string, alertOptions:IAlertOptions)
    }
}

app.ts

/// <reference path="typings/MyAlert.d.ts" />

var alert1 = new MdlCustomAlerts.CustomAlert("Hello World", {});

首先,我在 CustomAlert.ts 中收到“重复标识符”错误,因为定义中定义了类 CustomAlert。我需要一种通过使用定义而不使用 import/require 来访问我的 CustomAlert 的方法(我们不使用 require.js,所以这会导致问题)。

我想我需要做一些事情,比如为类导出一个公共标识符(也许将定义中的类重命名为 customAlert,然后导出引用),但我似乎无法以任何方式工作。如果有人可以帮助我找到解决方案,我将不胜感激!

提前致谢

【问题讨论】:

    标签: javascript typescript typescript-typings


    【解决方案1】:

    您可以直接从其他打字稿文件中引用打字稿文件;您不需要为它们定义类型。

    类型定义是为了从 Typescript 键入 javascript 文件。

    ... 你应该使用模块(ES6/commonJS - 不是现在所谓的命名空间)。如果不这样做,随着您的应用程序变得越来越大,您将陷入订购 TS 文件以进行正确编译的噩梦般的问题。

    CustomAlert.ts

    export class CustomAlert{
      constructor(alertMessage:string, alertOptions:IAlertOptions){
        alert(message);
      }
    }
    

    app.ts

    import {CustomAlert} from './CustomAlert'
    
    var alert1 = new CustomAlert("Hello World", {});
    

    【讨论】:

    • 感谢您的回复 - 我通常使用模块,但打算尝试简化问题。我的印象是,无论代码的来源是什么,类型定义通常都是一个好主意。我认为最好将接口存储在外部并提供库的“压缩”版本以供外部库使用。
    • 使用模块还引入了进一步的复杂性,这是我理想情况下想要解决的问题。例如,理想情况下,我希望(使用上面的示例) new CustomAlert("Message", {}) 直接可用,而不必使用 new MdlCustomAlertModule.CustomAlert("Message",{});我认为一个定义会使这成为可能......?
    • 如果您正在构建一个库,那么生成定义文件是有意义的,因为您将发送 js + 定义文件,因此您的库可以从 JS 和 TS 中使用
    • 对多个 cmets 感到抱歉 - 但使用定义文件还允许您评论代码并为库提供更多信息 - 而不必直接在打字稿源中执行此操作。并提供了一个更好的地方来引用正在使用的其他库。
    • 这是关于构建一个库的(目前我们有大约 30 个不同的库,它们经常相互交互)。理想情况下,我也希望将这些移动到私有 NuGet 服务器上。所以我希望在某个地方仍然有我的问题的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2021-11-30
    • 2015-12-17
    • 2021-10-24
    • 2017-11-05
    • 1970-01-01
    相关资源
    最近更新 更多