在 TypeScript 中引用外部模块
Reference External Modules in TypeScript
我有一个应用程序,我想逐步将其转换为 TypeScript。目前我们正在使用 browserify 生成一个包。
在转换为 TypeScript 时,我有一些模块尚未转换。在 TypeScript Handbook 它说我可以引用外部模块,当为它指定一个类型定义文件时。
我有一个模块 A.js 尚未转换为 TypeScript。我有一个定义
的全局类型定义文件
declare module "A" {
export function foo();
export function bar();
}
我正在这样导入我的模块:
///<reference path="../../typings/NotYetConvertedModules.d.ts" />
import A = require('../someFolder/A');
编译时我得到
error TS2307: Cannot find external module '../someFolder/A'
当用 require('A')
要求它时,编译步骤有效但模块加载器找不到文件,因为我没有它的全局别名。
有什么办法可以解决吗?
假设您正在使用外部模块(这意味着模块 ID 取决于文件名)
而不是写成../../typings/NotYetConvertedModules.d.ts
declare module "A" {
export function foo();
export function bar();
}
你应该简单地写成../someFolder/A.d.ts
export function foo();
export function bar();
当您在引号中声明模块名称时,引号中的名称将成为别名。所以当你写...
declare module 'A' { //...
您使用以下方式导入它(无论您在何处导入):
import a = require('A');
例如,这在为 node.js 模块创建定义时很有用。
您不能将字符串别名与相对路径一起使用,因此您不能:
declare module '../SomeFolder/A' { //...
但是您可以在适当的位置(SomeFolder)放置一个名为a.d.ts
的定义文件。
文件 ./SomeFolder/a.d.ts
如下所示:
declare module A {
export function foo();
export function bar();
}
export = A;
文件 ./Scripts/AnotherFolder/example.ts
如下所示:
import A = require('../../SomeFolder/A');
您将需要根据您的确切文件夹结构调整路径,但您可以看到这个想法。重要的是,从与定义文件相同的文件夹导入模块时不需要 reference
注释。
在使用打字稿作为参考时,我尽量避免使用相对路径。也许只有我一个人,但我发现它有问题(供参考)。
在您的 require.js 配置中,您可以将请求字符串映射到预定义的文件列表或一些类似的系统。例如 require("document.text")
可以看到 "document"
并将其映射到 src/net/unicorns/document/text.js
这也让您可以快速调试问题(typescript 编译器错误很烦人)。
希望对您有所帮助。
我有一个应用程序,我想逐步将其转换为 TypeScript。目前我们正在使用 browserify 生成一个包。
在转换为 TypeScript 时,我有一些模块尚未转换。在 TypeScript Handbook 它说我可以引用外部模块,当为它指定一个类型定义文件时。
我有一个模块 A.js 尚未转换为 TypeScript。我有一个定义
的全局类型定义文件declare module "A" {
export function foo();
export function bar();
}
我正在这样导入我的模块:
///<reference path="../../typings/NotYetConvertedModules.d.ts" />
import A = require('../someFolder/A');
编译时我得到
error TS2307: Cannot find external module '../someFolder/A'
当用 require('A')
要求它时,编译步骤有效但模块加载器找不到文件,因为我没有它的全局别名。
有什么办法可以解决吗?
假设您正在使用外部模块(这意味着模块 ID 取决于文件名)
而不是写成../../typings/NotYetConvertedModules.d.ts
declare module "A" {
export function foo();
export function bar();
}
你应该简单地写成../someFolder/A.d.ts
export function foo();
export function bar();
当您在引号中声明模块名称时,引号中的名称将成为别名。所以当你写...
declare module 'A' { //...
您使用以下方式导入它(无论您在何处导入):
import a = require('A');
例如,这在为 node.js 模块创建定义时很有用。
您不能将字符串别名与相对路径一起使用,因此您不能:
declare module '../SomeFolder/A' { //...
但是您可以在适当的位置(SomeFolder)放置一个名为a.d.ts
的定义文件。
文件 ./SomeFolder/a.d.ts
如下所示:
declare module A {
export function foo();
export function bar();
}
export = A;
文件 ./Scripts/AnotherFolder/example.ts
如下所示:
import A = require('../../SomeFolder/A');
您将需要根据您的确切文件夹结构调整路径,但您可以看到这个想法。重要的是,从与定义文件相同的文件夹导入模块时不需要 reference
注释。
在使用打字稿作为参考时,我尽量避免使用相对路径。也许只有我一个人,但我发现它有问题(供参考)。
在您的 require.js 配置中,您可以将请求字符串映射到预定义的文件列表或一些类似的系统。例如 require("document.text")
可以看到 "document"
并将其映射到 src/net/unicorns/document/text.js
这也让您可以快速调试问题(typescript 编译器错误很烦人)。
希望对您有所帮助。