【问题标题】:Using a backbone.d.ts使用主干.d.ts
【发布时间】:2012-10-14 11:35:17
【问题描述】:

当模块未定义为字符串时,我似乎无法让任何导入工作。怎么回事?

test.ts

import b = module('Backbone')

不起作用backbone.d.ts

declare module Backbone {

    export class Events {
    ...

作品backbone.d.ts

declare module "Backbone" {

    export class Events {
    ...

编辑 1

仅供参考,来自10.1.4

带有 StringLiteral 的 AmbientModuleIdentification 声明了一个外部模块。这种类型的声明只允许在全局模块中。 StringLiteral 必须指定顶级外部模块名称。不允许使用相对的外部模块名称

我不明白将其指定为herehere 中的字符串文字格式有什么用处。如果您在没有字符串文字模块的情况下使用///<reference...,它可以工作,但我正在尝试生成依赖于这些库的 AMD 模块,所以我需要导入才能工作。我是少数,我必须去修改每个 .d.ts 为字符串文字版本吗?

编辑 2

使用字符串文字声明模块要求您的导入与该字符串文字完全匹配。您不能再使用相对或绝对路径指向此模块/模块定义的位置,即使它与尝试导入它的文件不在同一目录中。这使得 ///<reference 和导入是必需的,但会生成一个带有 tsc --module AMD 的模块,该模块正是正在寻找的(模块的路径由模块字符串文字 "Backbone" 指示)。

例如。

+- dep/
   |- backbone.d.ts
|- test.ts

backbone.d.ts

declare module "Backbone" {
    export class Events {

作品test.ts

///<reference path="../dep/backbone.d.ts" />
import b = module('Backbone')

// generates
// define(["require", "exports", 'Backbone']

不起作用test.ts

import b = module('./dep/Backbone')

请注意,这也有效...

declare module "libs/Backbone" {
...
///<reference path="dep/backbone.d.ts" />
import b = module('libs/Backbone')
...
// generates
define(["require", "exports", 'libs/Backbone']

【问题讨论】:

  • 我也很想得到一个很好的解释。几周前,我在 codeplex 提交了一个issue,主题类似。该问题已关闭,评论说这与内部和外部模块之间的差异有关,他们希望尽快改进他们的文档......
  • 你可能想看看我的编辑 2 发现
  • 有趣。我仍然很好奇为什么许多声明不使用字符串文字格式。
  • @ryan 如果将backbone.d.ts 修改为declare module "Backbone" {...,那么我在backbone.d.ts 中的function noConflict(): Backbone; 处出现错误,说'Backbone' does not exist in current scope

标签: javascript typescript


【解决方案1】:

当你写这个时:

declare module Backbone {

这意味着您已经有一个全局范围内的模块(因此您可以立即使用它,不需要导入)。但是当你写这个时:

declare module "Backbone" {

这意味着您指定导入的模块 (import ... = module("...")) 的外观。

【讨论】:

  • 我更新了我的问题,如果您有任何其他想法,请分享
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多