打字稿找不到本地es6模块;错误TS2307:找不到模块

时间:2016-06-08 18:03:18

标签: javascript typescript ecmascript-6

我很难获得打字稿来识别本地es6模块的形状:

转换-time.js

export const minutes = sec => sec * 60
export const hours = sec => minutes(sec) * 60
export const days = sec => hours(sec) * 24
export const weeks = sec => days(sec) * 24
export const years = sec => days(sec) * 365

注意:我想弄清楚如何在不将convert-time.js更改为打字稿文件的情况下使其工作。

以下是我尝试将其导入的文件:

index.ts

/// <reference path="../typings/convert-time.d.ts" />

import { minutes, days } from '../test/helpers/convert-time'

这是我创建的类型定义文件:

转换-time.d.ts:

declare module "convert-time" {
  export function minutes(sec: number): number;
  export function hours(sec: number): number;
  export function days(sec: number): number;
  export function weeks(sec: number): number;
  export function years(sec: number): number;
}

这是我的tsconfig:

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "noImplicitAny": false,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true,
    "jsx": "react"
  },
  "files": [
    "typings/index.d.ts",
    "typings/convert-time.d.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

已尝试的步骤:

以上都没有奏效!我必须学会什么黑暗魔法让它发挥作用?谢谢!

1 个答案:

答案 0 :(得分:3)

关于ES6

由于您正在尝试与ES6模块互操作,因此您将“#34;

a)tsconfig.json更改为目标ES6并发出如下ES6模块:

{
  ...
  "target": "es6",
  "module": "es6",
  ...
}

但是我不认为你可以在NodeJS中使用ES6模块。

或:

b)让TypeScript将ES6 JavaScript模块转换为ES5,方法是在tsconfig.json compilerOptions下启用JavaScript处理 - 如下所示,并确保.js包含/不包括文件:

{
  ...
  "target": "es5",
  "module": "commonjs",
  "allowJs": true,
  ...
}

关于您的类型声明

在我的博客上阅读有关TypeScript如何发现打字/类型声明以及它希望在此处看到的内容:http://ivanz.com/2016/06/07/how-does-typescript-discover-type-declarations-definitions-javascript/

看来这个JavaScript文件是你自己的代码(不是NPM模块),所以:

  1. 只要文件未被排除或包含在/// <reference path="../typings/convert-time.d.ts" />
  2. 中,您就不需要tsconfig.json
  3. 确保convert-time.d.tsconvert-time.js
  4. 位于同一目录中
  5. 您不需要声明模块,因此请删除declare module "convert-time" {位。这是因为通过将.d.ts放在.js旁边,它是一个&#34;外部&#34;模块而不是&#34;环境&#39; (请参阅我的博客)(如果你正在创建一个生活在你自己的NPM包代码中的打字,你将需要declare位。
  6. 基本上:

    <强> ../测试/助手/转换-time.js:

    export const minutes = sec => sec * 60
    export const hours = sec => minutes(sec) * 60
    export const days = sec => hours(sec) * 24
    export const weeks = sec => days(sec) * 24
    export const years = sec => days(sec) * 365
    

    <强> ../测试/助手/转换-time.ts.d:

    export function minutes(sec: number): number;
    export function hours(sec: number): number;
    export function days(sec: number): number;
    export function weeks(sec: number): number;
    export function years(sec: number): number;
    

    <强> index.ts:

    import { minutes, days } from '../test/helpers/convert-time';
    

    tsconfig.json(用于ES5转换)

    {
      "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "allowJs": true,
        "noImplicitAny": false,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "jsx": "react"
      },
      "files": [
        "/test/helpers/convert-time.ts.d",
        "/test/helpers/convert-time.js",
        "index.ts"
      ]
    }