TypeScript
TypeScript特有の組み込み型関数
Type challenge
TypeScript導入にあたって
JavaScriptを熟知した人間にとっては、静的型の制限があることによりJavaScriptでは簡単に実現できていた設計がTypeScriptでは困難になるという場面がある。
コンパイル時評価 or コンパイル時計算
TypeScript のコンパイル時計算はどこまでできるのか?
TypeScriptはJavaScriptへのトランスパイル時に実行時に振る舞いを変えるような最適化や評価は行いない。
そのため、コードがJavaScriptにトランスパイルされたとしても、style1とstyle3の比較やオブジェクトの作成はランタイム時(ブラウザやNode.jsでコードが実際に実行される時)に行われる。
TypeScriptの主要な役割は型チェックにある。
これはコンパイル時(具体的にはトランスパイル時)に行われ、型の不整合や他の型関連のエラーを検出できる。
これにより、実行時のエラーを減少させ、コードの品質を向上させることが期待できる。
しかし、TypeScriptはJavaScriptへのシンプルなトランスパイルを目指しており、コンパイル時の最適化や変数の評価、インライン化などの高度な最適化は行いません。そのため、TypeScriptでの評価や計算は、トランスパイル後のJavaScriptコードが実際に実行される際(ラン タイム)に行われます。
これはTypeScriptがJavaScriptのスーパーセットであり、結果として出力されるJavaScriptの振る舞いや性能を直感的に理解することを目指しているためです。
staticキーワードは評価されるのか
JavaScriptやTypeScriptにおける static
キーワードに関連するフィールドやメソッドは、そのクラスのインスタンスを生成しなくてもアクセスできるメンバーを示します。しかし、static
が評価済みという意味ではない。
class MyClass {
static staticValue = "This is a static value";
static staticMethod() {
console.log("This is a static method.");
}
}
console.log(MyClass.staticValue); // This is a static value
MyClass.staticMethod(); // This is a static method.
上記の例では、MyClass
の staticValue
という静的フィールドと staticMethod
という静的メソッドにアクセスしています。これらはインスタンス化せずとも直接アクセス可能です。
しかしこの staticValue
の初期化や staticMethod
の定義自体は、スクリプトが読み込まれて実行されるタイミング(ランタイム)で行われます。ですので、static
キーワードが評価済みというわけではなく、実行時に評価されることを意味しています。
ただし、一部のJavaScriptエンジンやツールは、特定のパターンを検出して最適化を行うことがありますが、これはTypeScriptやJavaScriptの言語仕様に基づくものではありません。
overloadから型定義を取得する
TypeScript クラス内でアロー関数を使用する場合
class ParentClass {
// これはプロパティ
//hoge : () => void = () => console.log("Hoge");
// これはメソッド
hoge() {
console.log("Hoge");
}
}
TypeScript(およびJavaScript)において、アロー関数で定義するとクラスのインスタンスプロパティとして扱われます。これは、関数が実際にはそのインスタンスのプロパティ値として保存されるためです。この挙動は、関数の this
のスコープをクラスインスタンスに自動的にバインドする利点があります。したがって、アロー関数を用いたプロパティの定義は、特にイベントハンドラやコールバック関数として利用する 場合に便利です。
クラス内のアロー関数をプロパティとして定義する例
class ParentClass {
// アロー関数をプロパティとして定義
hoge: () => void = () => {
console.log("Hoge from property");
};
// 通常のメソッド定義
normalMethod() {
console.log("Hoge from method");
}
}
const instance = new ParentClass();
instance.hoge(); // "Hoge from property" が出力される
instance.normalMethod(); // "Hoge from method" が出力される
このコード例では、hoge
はクラスのインスタンスを通じて呼び出すことができるプロパティとして定義されています。アロー関数を使うと、this
が関数が定義された時点のコンテキスト(この場合はクラスのインスタンス)に永続的にバインドされるため、クラスの他のメソッドやプロパティに簡単にアクセスできます。これに対して、normalMethod
は通常のメソッドとして定義されており、特に this
の挙動に注意が必要な場合(例えばコールバックとして使用する場合など)は、適切にバインドするかアローファンクションを使用する必要があります。
TypeScriptのエラーハンドリング
TypeScript には Java の throws のように関数が throw する例外を宣言する方法がないので、どのような例外が throw され得るかを知るにはコードを読むしかありません。 result型は確かにいいけど可読性がいいかと言われたら違う。 そのためこれが一番セオリーかも。プロジェクトに導入した。
TypeScriptは構造型
TSDoc
参考 URL集
仕事ですぐに使える TypeScript 高度な型定義 URL TypeScript日本語ハンドブック typescript 型付テスト tsconfig.jsonを書くときはTSConfig Basesを使うと便利 TypeScriptで作るアノテー ション これまとめる これもまとめる TypeScriptのモデル生成速度比較 Three.js TypeScript webpack(これいつかやりたいな)
TypeScriptでグローバルな型定義ファイルを用意する
.d.ts
型定義ファイル (.d.ts)
.d.ts
ファイルは .ts
と .js
ファイルの間をつなぐブリッジ。