为什么我的打字稿接口被编译为javascript?

时间:2020-05-08 14:47:44

标签: javascript node.js typescript interface

据我了解,接口仅与Typescript相关,并且tsc编译器应足够聪明,以至于在最终输出中不将其转换为JS文件。当我编译我的代码时,正在使用它来编译接口。为什么会这样?

我简化的项目结构

src/
  index.ts
  lib/
    EventClient.ts
  interfaces/
    EventClientConfig.ts

它编译成什么

dist/
  index.js
  lib/
    EventClient.js
  interfaces/
    EventClientConfig.js

我的tsconfig.json

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "outDir": "./dist",
    "lib": ["ES6", "DOM"],
    "target": "ES2018",
    "module": "CommonJS",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "baseUrl": ".",
    "removeComments": true,
    "strict": true,
    "typeRoots": ["./node_modules/@types"],
    "rootDir": "./src",
    "types": [
      "node",
      "jest-fetch-mock",
      "express",
      "reflect-metadata"
    ]
  },
  "include": ["src"],
  "exclude": ["dist", "node_modules", "**/*spec.ts"]
}

界面

export interface EventClientConfig {
  endpoint: string;
  authToken: string;
}

我如何使用界面

import { EventClientConfig } from '../interfaces/EventClientConfig';

const config: EventClientConfig = {
  endpoint: '/api',
  authToken: '123456'
}

接口编译成什么

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });

在已编译的代码中,EventClient.js并未实际引用EventClientConfig.js,因此绝对不是必需的。为什么Typescript将接口文件编译为JS?

1 个答案:

答案 0 :(得分:2)

您的问题的答案在modules

在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级导入或导出的文件都被视为模块。相反,没有任何顶级导入或导出声明的文件将被视为脚本,其内容可在全局范围内使用(因此也可用于模块)。