打字稿泛型函数和索引参数
问题描述:
我有以下package.json
:打字稿泛型函数和索引参数
{
"name": "browserify-test",
"version": "1.0.0",
"description": "",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"scripts": {
"build:tsc": "tsc --outDir dist",
"build:browser": "browserify src/index.ts -p tsify --standalone MyLib > dist/myLib.js"
},
"devDependencies": {
"browserify": "^14.0.0",
"tsify": "^3.0.0",
"typescript": "^2.1.5"
}
}
继tsconfig.json
:
{
"compilerOptions": {
"noImplicitAny": true,
"module": "commonjs",
"target": "ES5",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"declaration": true
}
}
文件src/evets.d.ts
:
export interface MyEvent {
name: string
}
最后切入点src/index.js
:
import * as events from './events';
export class MyLibrary {
public test(eventInstance: events.MyEvent) {
console.log(eventInstance);
console.log(events);
}
}
构建纯打字稿版本的作品。 SO命令npm run build:tsc
作品完美,但努力建立与browserify,所以调用npm run build:browser
我得到以下错误:
> [email protected] build /home/aszmyd/tmp/browserify-test
> browserify src/index.ts -p tsify --standalone MyLib > dist/myLib.js
Error: Cannot find module './events' from '/home/aszmyd/tmp/browserify-test/src'
似乎browserify不能正常消耗与d.ts
扩展类型定义文件。
上面的例子在两种情况下WORKS:
当
index.ts
我导入像这样:import * as events from './events.d;
(注意结束.D)在i除去
console.log(events);
行(?!) - 它如何使用events.***
类型但不能使用整个集合(别名)?
我想我在这里失踪的东西假,但即时通讯缺乏创意。
答
运行
import * as events from './events';
尝试导入称为打字稿文件“events.ts”位于同一目录中导入文件。那是因为它是一个相对路径。
(进口./events.d
将在同一目录中导入events.d.ts
,解释了为什么“它的工作原理”)
要导入外部模块,import语句是使用模块名(不是路径)制成。因此,对于一个被称为“事件”模块,import语句会
import * as events from 'events'
当导入外部模块,编译器会寻找一个定义文件“输入”模块。根据模块的结构,这个文件可能是一个内部模块定义,看起来像你的'event.d.ts'或外部模块定义文件,它更可能看起来像
declare module 'events' {
export interface MyEvent {
name: string
}
}
谢谢!这是有道理的。但是,如果可以使用其他文件夹中的内部模块定义,请告诉我。即当'module.d.ts'文件不在同一个文件夹中时,我可以从'module'进行'导入*'吗?我假设编译器会查找'module.d.ts',然后查找'node_modules/module','../ node_modules/module'等,直到找到它。 –
当然。使用以模块名称命名的子文件夹创建一个'typings'目录。将模块定义文件粘贴在该子文件夹中。在'tsconfig.json'中,确保'typings'不被排除在编译路径之外(即包括在内)。这就对了 –