【问题标题】:Declaring JavaScript extended functions in TypeScript在 TypeScript 中声明 JavaScript 扩展函数
【发布时间】:2016-04-12 07:26:30
【问题描述】:

我有这种用 JavaScript 编写的 Node.js 模块:

function main(options) {
    return "some string";
}

main.methodName = function () {
    // implementation;
};

main.objectName = {
    // a namespace;
};

main.propertyName = 123;

module.exports = main;

在 TypeScript 中声明这样一个接口的正确方法是什么?

澄清

我问的是如何在 TypeScript 中为现有的 Node.js 模块正确声明这样的接口,以便可以从 TypeScript 文件中正确使用它,而不是如何在 TypeScript 中重新实现这样的接口。

更新

根据@toskv 的建议,我添加了以下接口:

declare module "my-module" {

    // Default library interface
    interface main {
        (options?:{}):string,
        methodName():any,
        propertyName:any,
        objectName:Object
    }

    export default main;
}

但如果我这样使用它:

import * as myModule from "my-module";
var s = myModule({});

然后我收到错误Cannot invoke an expression whose type lacks a call signature.

知道为什么吗?

【问题讨论】:

  • TypeScript 是 JavaScript 的超集,这意味着这段代码是有效的 JavaScript,也是有效的 TypeScript。
  • @Gothdo 虽然这是真的,但由于静态类型,TypeScript 使得在定义对象的类型之后扩展对象变得很痛苦。就像向函数添加属性一样。将代码转换为类更容易和更清晰。 :)

标签: javascript node.js typescript


【解决方案1】:

描述该代码的 TypeScript 接口将是:

interface MainIf {
    (options) : string ; // the main function
    methodName() : any;
    propertyName: number;
    objectName: Object;
}

【讨论】:

  • 他确实没有,但这样更干净。 :) 另一种方法是在主函数上添加额外属性时向 添加类型断言。我也会做一个例子。 :)
  • 我认为可能存在一些误解。我要求的是现有 Node.js 模块的声明接口,而不是实现以相同方式工作的新类的方法。
  • @vitaly-t 我添加了另一个示例,它只是修补当前代码以使其在 typescript 编译器中工作。 2的生成的js代码应该是等价的。
  • @vitaly-t 我做了,合适吗?
  • @toskv 在我的模块main(options) 中是一个返回字符串的函数,它绝不是一个类。那怎么修改呢?
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2020-05-15
  • 2021-05-03
  • 2018-03-11
相关资源
最近更新 更多