javascript - 本地 JS 文件的 Typescript 声明文件

标签 javascript typescript declaration type-declaration declaration-files

在转换为 Typescript 的过程中,我正在尝试为工作中的 Javascript 文件添加类型。但是,我无法识别声明文件。

这是我的文件结构

  • js
    • Foo.js
  • 打字
      • index.d.ts
  • index.ts
  • package.json
  • tsconfig.json

Foo.js

module.exports = function Foo() {
   return 'Bar';
 };

index.d.ts

export = Foo;

declare function Foo(): string;

index.ts

import Foo = require('./js/Foo')

console.log(Foo());

tsconfig.json

{
  "compilerOptions": {
    "typeRoots": ["./typings"],
    "target": "es5",
    "strict": true,
    "baseUrl": "./",
    "paths": {
      "*": ["typings/*"]
    }
  }
}

package.json

{
  "name": "fail",
  "version": "1.0.0",
  "description": "",
  "main": "index.ts",
  "scripts": {
    "tsc": "tsc"
  },
  "author": "",
  "license": "MIT",
  "dependencies": {
    "typescript": "^3.1.4"
  }
}

这里是重现我的问题的repo

https://github.com/erisman20/typings_help

编辑:这是我得到的错误

错误 TS7016:找不到模块“./js/Foo.js”的声明文件。 '....../js/Foo.js' 隐式具有 'any' 类型。

最佳答案

为诸如 './js/Foo' 之类的相对导入提供声明的唯一方法是在导入路径中实际拥有声明文件(加上 .d.ts/index.d.ts) 或者根据您的 rootDirs 选项将其虚拟地放在导入路径中。 typeRootsbaseUrl/paths 在这种情况下都不起作用:baseUrl/paths 仅影响“非相对”路径的模块解析,typeRoots 可用于让 TypeScript 加载文件,但根本不影响导入路径和文件之间的关系。

最简单的解决方案是将 Foo.d.ts 文件放在与 Foo.js 相同的目录中。如果您想将类型保存在单独的目录中,则可以将 "rootDirs": ["js", "typings"] 添加到 tsconfig.json。这种变化足以使您的示例对我有用,尽管我发现拥有相应的 Foo.jsFoo/index.d.ts 文件会令人困惑,并会鼓励您在使用子目录时保持一致,即在 JavaScript 端切换到 Foo/index.js 或在 TypeScript 端切换到 Foo.d.ts

关于javascript - 本地 JS 文件的 Typescript 声明文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53074172/

相关文章:

带有 "callback type"的 TypeScript 索引类型约束工作不正常?

javascript - 以 Angular 2 将 Typescript 编译为 ES5

引用现有变量时出现 Swift 编译器错误

javascript - 在 jQuery timeago.js 中本地化字符串

angular - 如何在 RxJS 订阅方法中等待

c - C 中的枚举类型变量声明

C 编程术语

javascript - 如何使用jQuery从golang代码(服务器)获取数据?

javascript - 验证 Google 日历网站/将其列入白名单

javascript - 反转二进制网络