我刚刚发布了一个用打字稿写的npm package。目前,我在使用typescript(webback和vscode)识别定义时遇到了很多麻烦。到目前为止唯一有效的解决方案是使用node_modules/@types
简单来说这是我的包装设置:
tsconfig.json
{
"compilerOptions": {
...
"outDir": "./lib/",
"declaration": true,
"declarationDir": "./src/",
}
}
的package.json
{
...
"types": "./index.d.ts",
}
index.d.ts
/// <reference path="src/nano-data-binding.d.ts" />
src / nano-data-binding.d.ts
我将其保留在/src
中,因为它是自动生成的,我无法控制导入的路径。此外,如果我尝试仅使用declare var ...
而不使用import export
语句来获取脚本而不是模块。
import { StringOrHTMLElement } from './interfaces/nano-data-binding';
export declare function nanoBind(parent: HTMLElement, ...selectors: StringOrHTMLElement[]): HTMLElement[];
export declare function nanoBindAll(parent: HTMLElement, ...selectors: string[]): HTMLElement[];
随意安装软件包,也许这只是一个小错误。基本上我想将nanoBind()
和nanoBindAll()
声明为全局变量。
修改
我试过的其他事情。什么都行不通。
package.json - Npm包
{
...
"types": "lib/nano-data-binding.d.ts",
"typings": "lib/nano-data-binding.d.ts",
"typescript": {
"definition": "lib/nano-data-binding.d.ts"
},
}
tsconfig.json - 本地项目
{
...
"files": [
"node_modules/nano-data-binding/lib/nano-data-binding.d.ts"
]
}
答案 0 :(得分:1)
在package.json
中,您需要将types
字段重命名为typings
是的,这里不需要三重斜杠指令
答案 1 :(得分:1)
终于找到了有用的东西。看起来在根级别使用index.d.ts
或在包的package.json
中指定自定义路线就足够了。
问题在于我的定义。它需要声明一个模块。
<强> index.d.ts 强>
type StringOrHTMLElement = string | HTMLElement
declare var nanoBind: (parent: HTMLElement, ...selectors: StringOrHTMLElement[]) => HTMLElement[];
declare var nanoBindAll: (parent: HTMLElement, ...selectors: string[]) => HTMLElement[];
declare module 'nano-data-binding' {
export var nanoBind: (parent: HTMLElement, ...selectors: any[]) => HTMLElement[];
export var nanoBindAll: (parent: HTMLElement, ...selectors: string[]) => HTMLElement[];
}
而不是导入的方式
<强> main.ts 强>
import * as ndb from 'nano-data-binding' // Imports script and definition
require('nano-data-binding') // Ignores definition
答案 2 :(得分:1)
您遇到的问题是由于您的tsconfig.json尝试显式包含输入文件。
当你在package.json中指定types
或typings
字段时,会自动加载npm package typings文件。
当您删除tsconfig.json中files
数组中的条目时,它应该可以正常工作。
您找到的解决方案(添加declare module 'nano-data-binding' { }
)是一种解决方案,可以为没有打字的某些包创建自定义类型。
为了更具技术性,当一个打字文件(d.ts)不包含顶级导入导出语句时,它是一个环境脚本文件,它是全局范围的。这就是为什么你需要declare module '...'
来表明你正在为哪个模块添加打字。
您通常在How to consume the Moment.js TypeScript definition file if my site is already using moment.min.js?
中使用它们