5

モジュールが文字列として定義されていない場合、インポートが機能しないようです。何が起こっている?

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 は、最上位の外部モジュール名を指定する必要があります。相対外部モジュール名は許可されていません

hereおよびhereにあるように、文字列リテラル形式として指定しないことがどのように役立つかわかりません。文字列リテラル モジュールなしで使用しても機能しますが、これらのライブラリに依存する AMD モジュールを生成しようとしているため、機能するにはインポートが必要です。私は少数派で、各.d.tsを変更して文字列リテラル バージョンにする必要がありますか?///<reference...

編集2

文字列リテラルを使用してモジュールを宣言するには、その文字列リテラルの場合、インポートが完全に一致する必要があります。インポートしようとしているファイルと同じディレクトリにない場合でも、このモジュール/モジュール定義の場所への相対パスまたは絶対パスを使用できなくなりました。これにより、 a///<referenceと import が必要になりますが、tsc --module AMD正確に探していたモジュールが生成されます (モジュールへのパスは、モジュール文字列literal によって指示されます"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']
4

1 に答える 1

1

これを書くとき:

declare module Backbone {

これは、グローバル スコープにあるモジュールが既にあることを意味します (そのため、すぐに使用できます。インポートは必要ありません)。しかし、これを書くとき:

declare module "Backbone" {

これは、インポートされたモジュール (import ... = module("...")) がどのように見えるかを指定することを意味します。

于 2012-10-24T12:32:48.090 に答える