导入的JS模块的本地类型定义无法识别

时间:2017-12-20 09:55:02

标签: typescript visual-studio-code

我使用import * as ss from 'simple-ajax-uploader'语法导入无类型的JS NPM模块。我在/scripts/@types/simple-ajax-uploader/index.d.ts创建了一个类型定义文件,我希望VS Code能够根据以下tsconfig.json进行识别:

{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "es2015.promise", "es5"],
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "typeRoots": [
      "./node_modules/@types/",
      "./scripts/@types/"
    ],
    "sourceMap": true,
    "baseUrl": ".",
    "jsx": "react"
  },
  "compileOnSave": false
}

如果我执行以下其他,我获取智能感知

  1. 将定义文件放在node_modules/@types/simple-ajax-uploader
  2. 删除import(因此将ss视为全局变量)。
  3. 但是,我无法使用导入来获取本地类型定义。我的模块编译,但是当我输入ss.时,我没有得到任何智能感知 - 该变量显然被视为any

    我的(迄今为止最小的)定义文件,它的价值是什么:

    export as namespace ss;
    
    export interface SimpleUploadOptions {
        // TODO
    }   
    
    export class SimpleUpload {
        constructor (options: SimpleUploadOptions)
    }
    

1 个答案:

答案 0 :(得分:0)

事实证明typeRoots仅用于加载全局定义的标识符的声明(因此当我删除import语句时它的工作原理)。对于导入的模块,您需要使用paths中的tsconfig.json属性:

"paths" :{
  "*": ["./scripts/@types/*", "*"]
}

这告诉编译器在执行模块解析时查看指定的文件夹(除了默认位置,例如node_modules)。

(感谢https://stackoverflow.com/a/40326719/3248302指出我正确的方向。)