2017-01-06 13 views
3

ライブラリ用のTypeScript定義ファイルを作成しようとしています。カスタムconst enumを使用したTypescript定義

ライブラリーには、タイプnumberのパラメーターを受け入れるメソッドがありますが、このパラメーターは数字の特定のセットのみにすることができるので、const enumを使用して作成した列挙型が必要です。

// definitions/SimpleDefinition.d.ts 

/// <reference path="Enums.ts" /> 

declare class SampleDefinedClass { 
    public static SampleMethod(enumArg: Enums.SampleEnum): void; 
} 

このような私の列挙::私はそうのように、.d.tsで私のクラスを定義するとき

しかし、

// definitions/Enums.ts 

export const enum SampleEnum { 
    Item1 = 1, 
    Item2 = 2 
} 

そして、私は2結びつけるためにindex.d.tsがあります

// definitions/index.d.ts 

/// <reference path="Enums.ts" /> 
/// <reference path="SampleDefinition.d.ts" /> 

このコンパイラは私にこう伝えます:

../definitions/SampleDefinition.d.ts(4,41): error TS2503: Cannot find namespace 'Enums'. 

SampleDefinition.d.tsの先頭にインポートを追加しようとしましたが、その結果、自分のコードファイルで定義が正しく認識されませんでした。 Visual StudioとVisual Studioのコードでは実際のインポートでエラーが表示されません。

import Enums = require("./Enums");

Main.ts(6,1): error TS2304: Cannot find name 'SampleDefinedClass'. 

私はAMDを使用して、そして周りのファイルを移動するように、いくつかのより多くの事を試してみましたが、これは仕事を得るように見えることはできません。これを行う方法はありますか?あるいは、私はそれをやるための別の方法を見つけなければならないでしょうか?

この正確なサンプルでGitHub repoを作成しました。

答えて

2

お客様のSampleDefinition.d.tsには、トップレベルのインポートまたはエクスポートはありません。Enum.tsはありません。つまり、Enumsはモジュールであり、SampleDefinitionはありませんが、Enumsを使用しようとしています。古い(古い)用語を使用すると、SampleDefinition.d.tsは内部モジュールであり、Enumsは外部モジュールであり、2つを1つのアプリケーションで混在させることはできません。

それらの一貫性を保つために2つの方法があります。

Enum.tsを固定:すべてが内部的にすることです

一つの方法は、トップレベルでのインポート/エクスポートせずに、namespace

exportを包みます
namespace Enums { 
    export const enum SampleEnum { 
     Item1 = 1, 
     Item2 = 2 
    } 
} 

固定Main.ts - ただ削除import Enums ..

それを宣言するのではなく、import代わりのreference、およびexportクラスを使用します:

固定SampleDefinition.ts

import Enums = require("./Enums"); 


export class SampleDefinedClass { 
    public static SampleMethod(enumArg: Enums.SampleEnum): void; 
} 

Main.tsを固定:

/// <reference path="../definitions/index.d.ts" /> 

console.log(Enums.SampleEnum.Item2); 
SampleDefinedClass.SampleMethod(Enums.SampleEnum.Item1); 

別の方法は、モジュールにすべてを有効にすることです再び、のすべてを明示的にreferenceの代わりに指定します。そのように、あなたはまったくdefinitions/index.d.tsを必要としない:選択する方法

import Enums = require("../definitions/Enums"); 
import {SampleDefinedClass} from "../definitions/SampleDefinition" 


console.log(Enums.SampleEnum.Item2); 
SampleDefinedClass.SampleMethod(Enums.SampleEnum.Item1); 

はあなた次第です。主な違いは、モジュールでは、実行時にモジュールローダーが必要になることです。モジュールなしでは、1つの結合されたスクリプトファイルにコンパイルできます。これは主にブラウザー(モジュールローダーを自分で提供する必要がある)にとって重要です。ノード用にコンパイルされたモジュラーコードはrequireを使用し、正常に動作します。

+0

私は最初の提案を新しいブランチに適用しました:https://github.com/Rene-Sackers/TypeScriptDefinitionsTest/tree/ edit-1しかし、私はまだ '名前を見つけることができません 'SampleDefinedClass'' –

+1

そのブランチの' SampleDefinition.d.ts'に 'export class SampleDefinedClass'があるからです。元のコードには 'declare class SapmleDefinedClass'があります。これは最初のオプションで動作するはずです。 – artem

+0

ああ!私の謝罪は、完璧に動作します! –

0

定義ファイルでは、declareで列挙をエクスポートする必要があります。

は、私はここで一つで、DefinitelyTypedからいくつかの例を見上げ:

export declare enum EDeflateStrategy { 
    DEFAULT_STRATEGY = 0, 
    FILTERED = 1, 
    HUFFMAN_ONLY = 2, 
    RLE = 3, 
    FIXED = 4, 
} 

あなたのコードの問題は、あなたの定義ファイルではなく、別の.d.tsファイルの.TSファイルを見ているように見えるということです。

これはあなたのライブラリである、それはあなたがちょうどあなたのtsconfig.jsonファイルに

"declaration": true 

を追加し、TSCは、あなたのための定義を生成させることができ、TSで記述されている場合。

もしそうでなければ、このライブラリのものをtsでモックしようとして、このオプションを有効にしてtscが宣言を生成させるようにしてください。

+0

コンパイルするにはenumが必要なので、私はそれを使うことはできません。元のメソッドは数値引数を受け取り、const enumは.jsの実際の数値にコンパイルされます –

関連する問題