Typescript泛型函数和索引参数
我有以下Typescript泛型函数和索引参数,typescript,browserify,tsify,Typescript,Browserify,Tsify,我有以下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": "brow
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"
}
}
{
"compilerOptions": {
"noImplicitAny": true,
"module": "commonjs",
"target": "ES5",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"declaration": true
}
}
下面是tsconfig.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"
}
}
{
"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);
}
}
构建纯类型脚本版本是可行的。因此,命令npm run build:tsc
工作得很好,但尝试使用browserify进行构建,因此调用npm run build:browser
会出现以下错误:
> browserify-test@1.0.0 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
的类型定义文件
上述示例在两种情况下均有效:
index.ts
中时,我像这样导入:import*as events from./events.d代码>(注意结尾.d)
console.log(事件)时代码>行(?!)-如何使用事件。***
类型,但不能使用整个集合(别名)
我想我在这里遗漏了一些东西,但我缺乏想法。跑步
import * as events from './events';
尝试导入名为“events.ts”的typescript文件,该文件与导入文件位于同一目录中。这是因为它是一条相对路径
(导入/events.d
将导入同一目录中的events.d.ts
,解释“它工作”的原因)
要导入外部模块,可以使用模块名称(而不是路径)执行import语句。因此,对于名为“events”的模块,import语句将是
import * as events from 'events'
导入外部模块时,编译器将查找定义文件,“键入”模块。根据模块的结构,该文件可能是一个类似于“event.d.ts”的内部模块定义文件,也可能是一个类似于“event.d.ts”的外部模块定义文件
declare module 'events' {
export interface MyEvent {
name: string
}
}
谢谢这是有道理的。但您能告诉我是否可以使用其他文件夹中的内部模块定义吗。也就是说,当
module.d.ts
文件不在同一文件夹中时,我是否可以将import*作为“模块”
中的某物导入?我假设编译器查找module.d.ts
,然后查找node\u modules/module
,。/node\u modules/module
等,直到找到它的答案。创建一个typings
目录,其中包含以模块名称命名的子文件夹。将模块定义文件粘贴到该子文件夹中。在tsconfig.json
中,确保编译路径中未排除typings
(即包括在内)。就这样