Typescript 类型脚本2:非类型化npm模块的自定义类型

Typescript 类型脚本2:非类型化npm模块的自定义类型,typescript,npm,typescript-typings,Typescript,Npm,Typescript Typings,在尝试了发布的建议之后,我发现自己无法运行使用非类型化NPM模块的typescript项目。下面是一个简单的例子和我尝试的步骤 对于这个最小的示例,我们将假设lodash没有现有的类型定义。因此,我们将忽略包@types/lodash,并尝试手动将其打字文件lodash.d.ts添加到我们的项目中 文件夹结构 节点单元 洛达斯 src 福茨 打字 习俗 lodash.d.ts 全球的 索引d.ts package.json tsconfig.json typings.json

在尝试了发布的建议之后,我发现自己无法运行使用非类型化NPM模块的typescript项目。下面是一个简单的例子和我尝试的步骤

对于这个最小的示例,我们将假设
lodash
没有现有的类型定义。因此,我们将忽略包
@types/lodash
,并尝试手动将其打字文件
lodash.d.ts
添加到我们的项目中

文件夹结构

  • 节点单元
    • 洛达斯
  • src
    • 福茨
  • 打字
    • 习俗
      • lodash.d.ts
    • 全球的
    • 索引d.ts
  • package.json
  • tsconfig.json
  • typings.json
接下来是文件

文件
foo.ts

///<reference path="../typings/custom/lodash.d.ts" />
import * as lodash from 'lodash';

console.log('Weeee');
/// <reference path="custom/lodash.d.ts" />
/// <reference path="globals/lodash/index.d.ts" />
文件
package.json

{
  "name": "ts",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "typings": "./typings/index.d.ts",
  "dependencies": {
    "lodash": "^4.16.4"
  },
  "author": "",
  "license": "ISC"
}
{
  "compilerOptions": {
    "target": "ES6",
    "jsx": "react",
    "module": "commonjs",
    "sourceMap": true,
    "noImplicitAny": true,
    "experimentalDecorators": true,
    "typeRoots" : ["./typings"],
    "types": ["lodash"]
  },
  "include": [
    "typings/**/*",
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}
{
    "name": "TestName",
    "version": false,
    "globalDependencies": {
        "lodash": "file:typings/custom/lodash.d.ts"
    }
}
文件
tsconfig.json

{
  "name": "ts",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "typings": "./typings/index.d.ts",
  "dependencies": {
    "lodash": "^4.16.4"
  },
  "author": "",
  "license": "ISC"
}
{
  "compilerOptions": {
    "target": "ES6",
    "jsx": "react",
    "module": "commonjs",
    "sourceMap": true,
    "noImplicitAny": true,
    "experimentalDecorators": true,
    "typeRoots" : ["./typings"],
    "types": ["lodash"]
  },
  "include": [
    "typings/**/*",
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}
{
    "name": "TestName",
    "version": false,
    "globalDependencies": {
        "lodash": "file:typings/custom/lodash.d.ts"
    }
}
文件
typings.json

{
  "name": "ts",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "typings": "./typings/index.d.ts",
  "dependencies": {
    "lodash": "^4.16.4"
  },
  "author": "",
  "license": "ISC"
}
{
  "compilerOptions": {
    "target": "ES6",
    "jsx": "react",
    "module": "commonjs",
    "sourceMap": true,
    "noImplicitAny": true,
    "experimentalDecorators": true,
    "typeRoots" : ["./typings"],
    "types": ["lodash"]
  },
  "include": [
    "typings/**/*",
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}
{
    "name": "TestName",
    "version": false,
    "globalDependencies": {
        "lodash": "file:typings/custom/lodash.d.ts"
    }
}
如您所见,我尝试了许多不同的输入方式:

  • 通过在
    foo.ts
  • 通过
    package.json中的
    typings
    属性
  • 通过将
    tsconfig.json
    中的
    typeroot
    与文件
    typings/index.d.ts
  • 通过在
    tsconfig.json
  • 通过在
    tsconfig.json
  • 通过定制
    typings.json
    文件并运行
    typings安装
  • 然而,当我运行Typescript时:

    E:\temp\ts>tsc
    error TS2688: Cannot find type definition file for 'lodash'.
    

    我做错了什么?

    编辑:过时。阅读上面的答案

    我还是不明白,但我找到了解决办法。 使用以下
    tsconfig.json

    {
      "compilerOptions": {
        "target": "ES6",
        "jsx": "react",
        "module": "commonjs",
        "sourceMap": true,
        "noImplicitAny": true,
        "experimentalDecorators": true,
        "baseUrl": ".",
        "paths": {
          "*": [
            "./typings/*"
          ]
        }
      },
      "include": [
        "src/**/*"
      ],
      "exclude": [
        "node_modules",
        "**/*.spec.ts"
      ]
    }
    

    删除
    typings.json
    和文件夹
    typings
    下的所有内容,除了
    lodash.d.ts
    。还要删除所有的
    //…
    引用

    不幸的是,这些东西目前没有很好的文档记录,但是即使您能够让它工作,我们也来检查一下您的配置,以便您了解每个部分在做什么,以及它与typescript如何处理和加载打字相关

    首先,让我们回顾一下您收到的错误:

    错误TS2688:找不到“lodash”的类型定义文件。
    
    此错误实际上不是来自您的导入或引用,也不是来自您试图在ts文件中的任何位置使用lodash。相反,它来自于对如何使用
    typeroot
    types
    属性的误解,所以让我们更详细地讨论一下这些属性

    关于
    typeroot:[]
    types:[]
    属性的一点是,它们不是加载任意声明(
    *.d.ts
    )文件的通用方法

    这两个属性与新的TS 2.0特性直接相关,该特性允许从NPM包中打包和加载类型声明

    要理解这一点非常重要,它们仅适用于NPM格式的文件夹(即包含package.json或index.d.ts的文件夹)

    typeroot
    的默认值为:

    {
       "typeRoots" : ["node_modules/@types"]
    }
    
    默认情况下,这意味着typescript将进入
    节点\u modules/@types
    文件夹,并尝试将在那里找到的每个子文件夹作为npm包加载

    重要的是要了解,如果文件夹没有类似npm包的结构,则此操作将失败

    这就是您案例中发生的情况,也是您最初错误的来源

    您已将typeRoot切换为:

    {
        "typeRoots" : ["./typings"]
    }
    
    这意味着typescript现在将扫描
    /typings
    文件夹中的子文件夹,并尝试将找到的每个子文件夹作为npm模块加载

    因此,让我们假设您刚刚有了指向
    /typings
    typeroot
    设置,但还没有任何
    类型:[]
    属性设置。您可能会看到以下错误:

    错误TS2688:找不到“自定义”的类型定义文件。
    错误TS2688:找不到“全局”的类型定义文件。
    
    这是因为
    tsc
    正在扫描您的
    /typings
    文件夹,并查找子文件夹
    custom
    global
    。然后,它试图将这些解释为npm包类型键入,但这些文件夹中没有
    index.d.ts
    package.json
    ,因此您会得到错误

    现在,让我们谈谈您正在设置的
    类型:['lodash']
    属性。这有什么用?默认情况下,typescript将加载它在
    typeRoots
    中找到的所有子文件夹。如果指定
    types:
    属性,它将只加载那些特定的子文件夹

    在您的情况下,您告诉它加载
    /typings/lodash
    文件夹,但它不存在。这就是为什么你会得到:

    错误TS2688:找不到“lodash”的类型定义文件
    
    让我们总结一下我们所学到的。Typescript 2.0引入了
    typeRoots
    types
    ,用于加载打包在npm包中的声明文件。如果您有自定义打字或单个松散的
    d.ts
    文件,但这些文件未包含在遵循npm软件包约定的文件夹中,则这两个新属性不是您想要使用的。Typescript 2.0并没有真正改变如何使用它们。您只需通过以下标准方式之一将这些文件包括在编译上下文中:

  • 直接将其包含在
    .ts
    文件中:
    //

  • 文件中包括
    /typings/custom/lodash.d.ts
    :[]
    属性

  • 文件中包括
    /typings/index.d.ts
    :[]
    属性(然后递归地包括其他类型)

  • /typings/**
    添加到您的
    包括:

  • 希望是基于