首页 > 解决方案 > TypeScript 声明文件(函数构造函数)

问题描述

我正在尝试为 npm 包创建一个 TypeScript 声明文件。

JavaScript(来自 npm 包的 index.js):

function Foo(config = {}) {
   this.configuration = {
       prop1 = config.prop1 || 'value'
   }
}
/// more...
module.exports = Foo;

我的 TypeScript 声明文件(index.d.ts):

declare module '@company/modulename' {

   interface config {
      prop1?: string;
   }

   declare function Foo(config: config): void;
   exports = Foo;
}

用法(server.ts):

import { Foo } from '@company/modulename'; // <-- this fails as noted below
// const Foo = require('@company/modulename'); <-- this works!

const foo = new Foo({
   prop1: 'Halp'
});

/// more stuff...

问题:

TypeScript 声明文件非常有用。除了,当我尝试运行 server.ts 时,我收到一个错误:TypeError: modulename_1.Foo is not a constructor. 如果我切换到 require 语法,一切都会按预期工作......但是我没有得到类型检查!

我的 tsconfig.json:

{
  "compilerOptions": {

    "target": "ES2019",                          
    "module": "commonjs",                     
    "outDir": "dist",                         
    "rootDir": "./",                          

    /* Strict Type-Checking Options */
    "strict": true,
    "noImplicitAny": false,                                     

    /* Additional Checks */

    /* Module Resolution Options */
    "esModuleInterop": true,                  

    /* Source Map Options */

    /* Experimental Options */

    /* Advanced Options */
    "skipLibCheck": true,                     
    "forceConsistentCasingInFileNames": true  
  }
}

更新+更正:

我的 TypeScript 声明文件(index.d.ts):

declare module '@company/modulename' {

   interface config {
      prop1?: string;
   }

   export default function Foo(config: config): void;
}

用法(server.ts):

import Foo from '@company/modulename'; // Braces removed from Foo

const foo = new Foo({
   prop1: 'Halp'
});

标签: typescript

解决方案


import Foo from '@company/modulename';工作?如果不尝试,请export default Foo;再试一次。


推荐阅读