質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • TypeScript

    319questions

    TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

typescriptの正しい書き方が知りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,430

rinteq

score 4

typescript の playground で下記のように書いて実行してみると、下記のようなエラーが出ていました。
-----------------
TypeError: undefined is not a constructor (evaluating 'new test.ClassA(3)')
-----------------

declare module test {
    export class ClassA {
        constructor(param1: number);
        public ModuleA(): string;
    }
}

module test {
    class ClassA {
        private _num: number;
        constructor(param1: number) {
            this._num = param1;
        }
        public ModuleA(): string {
            return "ModuleA";
        }
    }
}

var ss: test.ClassA = new test.ClassA(3);
console.log(ss.ModuleA());

変換されるjavascriptから、エラーが発生するのはなぜかは分かっているつもりなのですが、typescriptとして、どう書くべきなのかがよくわかっていません。

どなたか教えていただけないでしょうか。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

declare module test { ... } が不要なのでは無いでしょうか。

代わりに module test { ... } の class ClassA を export します。

module test {
    export class ClassA {
        private _num: number;
        constructor(param1: number) {
            this._num = param1;
        }
        public ModuleA(): string {
            return "ModuleA";
        }
    }
}

var ss: test.ClassA = new test.ClassA(3);
console.log(ss.ModuleA());

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/30 15:25

    ご回答ありがとうございます。

    ご教授いただいたようにやれば、うまく動作する事は分かるのですが、
    最終的にはdeclare module test ... を「〜d.ts」にしたいです。
    その際はどうしたら良いでしょうか。

    よろしくお願いいたします。

    キャンセル

  • 2015/05/30 15:30

    -d オプションでビルドすると .d.ts ファイルができます。

    tsc -d ClassA.ts

    キャンセル

  • 2015/05/30 17:59

    ngyukiさん
    回答ありがとうございます。
    もう少しお付き合いいただけると幸いです。

    実際にd.tsを変換した結果が下記です。
    ```lang-TypeScript
    declare module test {
    class ClassA {
    private _num;
    constructor(param1: number);
    ModuleA(): string;
    }
    }
    ```

    ①export宣言は d.ts or ts ?
    ClassAをexportしたいときは、型定義ファイルではなく、実体のtsファイルの方でexport宣言をすれば良いのでしょうか?
    →もしそうだとすると、ここを勘違いしていて、d.tsに記載するときにexport宣言するものと思っていました。

    ②実態のtsファイルには参照は必要無い?
    定義しているクラスの実体を記載しているtsファイルには、d.tsファイルの参照は必要無いのでしょうか?
    一つのプロジェクトで一つのd.tsファイルを作成しようと思っていたのですが、各クラスはそれぞれ別ファイルで作成しています。
    d.tsファイルを参照すると、「Duplicate identifier 〜」という警告が出てしまいます。
    typescriptのファイル構成をどうすべきか、教えていただけると幸いです。

    キャンセル

  • 2015/05/30 21:48

    ts と d.ts を C/C++ のソースファル/ヘッダファイルのように思われているのかもしれませんが、そうではありません。
    基本的に ts ファイルがあるなら d.ts ファイルは必要ありません。
    d.ts は既存の js のライブラリで定義されたクラスを TypeScript で型安全に使うためのものなので、はじめから ts ファイルを書いているのであれば必要ありません。

    キャンセル

  • 2015/05/30 22:46

    ngyukiさん
    回答ありがとうございます。

    >ts と d.ts を C/C++ のソースファル/ヘッダファイルのように思われているのかもしれま
    >せんが、そうではありません。

    まさにそう思っていました。
    そうでは無いんですね。
    これでスッキリしました。

    長いことお付き合いいただき、ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • TypeScript

    319questions

    TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。