Typescript 类型脚本2:非类型化npm模块的自定义类型
在尝试了发布的建议之后,我发现自己无法运行使用非类型化NPM模块的typescript项目。下面是一个简单的例子和我尝试的步骤 对于这个最小的示例,我们将假设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
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安装
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/**
添加到您的包括: