【问题标题】:Why does this custom type definition not properly export a function?为什么这个自定义类型定义不能正确导出函数?
【发布时间】:2019-12-02 20:25:20
【问题描述】:

我的 Typescript 项目中有一个 npm 依赖项 (electron-is-accelerator),它没有类型,既不是包的一部分,也不是 DefinitiveTyped 的一部分。依赖项由一个模块组成,该模块只有一个接受字符串并返回布尔值的函数。我在src/@types/electron-is-accelerator 中写了一个类型定义,如this article 中所述:

declare module 'electron-is-accelerator' {
    export function isAccelerator(s: string): boolean;
}

我试着像这样执行这个函数:

import { isAccelerator } from 'electron-is-accelerator';

console.log(isAccelerator("Alt+Space")); 

但我收到以下运行时错误:

TypeError: electron_is_accelerator_1.isAccelerator is not a function

我怎样才能让它运行?

我的tsconfig.json

{
    "compilerOptions": {
        "outDir": "./built",
        "module": "commonjs",
        "target": "es6",
        "noImplicitAny": true,
        "sourceMap": false
    },
    "include": [
        "src/**/*"
    ]
}

我上传了一个最小的演示示例here,供任何想解决这个问题的人使用。

【问题讨论】:

    标签: typescript definitelytyped


    【解决方案1】:

    那个package使用CommonJS module.exports语法导出函数:

    module.exports = function (str) { ... };
    

    module.exports 不同于上面示例中的 ES 模块 default export 语法和您命名的导出声明,因此 TS 有 export =, import = require() 来表达这些导入/导出。 electron-is-accelerator 可以使用以下声明输入:

    declare module "electron-is-accelerator" {
      function isAccelerator(s: string): boolean;
    
      export = isAccelerator;
    }
    

    导入看起来像这样:

    import isAccelerator = require("electron-is-accelerator")
    
    isAccelerator("whatever")
    

    如果esModuleInterop开启,可以写成ES默认导入:

    import isAccelerator from "electron-is-accelerator"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 2019-08-26
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多