ウォーターフォールは間違っている!私がアジャイル開発をエンジニアに勧める理由
TypeScriptのthis.constructorが非推奨となっていた件
目次
this.constructorとは
TypeScriptでクラスのインスタンスから自身のコンストラクタを参照する方法としてthis.constructor
が使われてきました。継承関係のあるクラスで、サブクラスからスーパークラスのメソッドを呼び出す際によく使用されていました。
class Animal {
protected name: string;
constructor(name: string) {
this.name = name;
}
}
class Dog extends Animal {
bark() {
// this.constructorを使用した例
console.log(`${this.constructor.name}の${this.name}が鳴きます`);
}
}
非推奨となった背景
TypeScript 4.8からthis.constructorの使用が非推奨となりました。主な理由は型安全性の問題です。JavaScriptのconstructorプロパティは動的な性質を持っているため、TypeScriptの型システムで正確に扱うことが難しかったのです。
実際のコードでは次のような問題が発生していました:
- 継承階層での型の不一致
- コンパイル時のチェックが不十分
- ランタイムエラーの可能性
具体的な問題点
以下のコードで具体的な問題を見てみましょう。
class Base {
static doSomething() {
return "Base";
}
method() {
// 問題のあるコード
return this.constructor.doSomething();
}
}
class Derived extends Base {
// staticメソッドをオーバーライドしていない
}
const d = new Derived();
d.method(); // 実行時エラーの可能性あり
このコードには以下の問題があります:
this.constructor
の型が正確に推論できない- 静的メソッドの存在チェックが不完全
- 継承時の型安全性が保証できない
推奨される代替手段
代わりに以下のアプローチが推奨されています:
- スタティックメソッドの直接呼び出し
class Animal {
static makeSound() {
return "...";
}
makeNoise() {
// 直接クラス名で呼び出し
return Animal.makeSound();
}
}
- インスタンスメソッドの利用
class Shape {
getType() {
return "Shape";
}
describe() {
// インスタンスメソッドを使用
return `This is a ${this.getType()}`;
}
}
移行のポイント
既存コードを移行する際は以下の点に注意しましょう:
- 静的メソッドは直接クラス名で呼び出す
- インスタンスの型情報が必要な場合は専用のメソッドを作成
- 継承関係がある場合は抽象メソッドの使用を検討
- 型安全性を重視した設計に見直す
新しいコードを書く際は、最初からthis.constructorの使用を避け、型安全な設計を心がけることをお勧めします。
- 内蔵GPUのRadeon 680M,760MでCS:GO2は動く?|AMD Ryzen 7 6850Hの実力を検証!
- 内蔵GPUのRadeon 680M,760MでCOD BO6は動く?|AMD Ryzen 7 6850Hの実力を検証!
- 内蔵GPUのRadeon 680M,760MでVALORANTは動く?|AMD Ryzen 7 6850Hの実力を検証!
- 内蔵GPUのRadeon 680M,760MでAPEXは動く?|AMD Ryzen 7 6850Hの実力を検証!
- 内臓GPUの性能が良いミニPCをコスパ順でまとめてみた
- TypeScriptで非推奨になっている機能一覧
- TypeScriptのexport defaultが非推奨となっていた件
- TypeScriptのNamespaceが非推奨となっていた件
- TypeScriptのthis.constructorが非推奨となっていた件
- TypeScriptのコンストラクタ引数でのpublic/privateが非推奨となっていた件
- TypeScriptのvarキーワードが非推奨となっていた件
- TypeScriptのFunction型が非推奨となっていた件
- TypeScriptのString, Number, Boolean型が非推奨となっていた件
- TypeScriptのanyが非推奨となっていた件
- TypeScriptのenumが非推奨となっていた件
- 内蔵GPUのメモリ割り当てを増やす方法【2024年版】
- ウォーターフォールは間違っている!私がアジャイル開発をエンジニアに勧める理由
- IT業界の酷い下請け構造は誰のせいなのか
- IT業界の下請け構造が酷すぎる!!
- クラウディアと他のクラウドソーシングサービスの比較
- Zigプログラミング言語とは?RustやC++との違いを解説
- めっちゃ早いPython?Nimというプログラミング言語について
- Rubyの静的型付け版?Crystalってどんな言語なのか解説
- Elixirは開発しづらい?Gleamへ移行しよう – 開発体験が劇的に改善
- Gleamの基本的な構文とデータ型
- Gleamの環境構築方法[Linux]
- Gleam言語でのWebアプリ開発ロードマップ
- MacBook Pro M1の外部ディスプレイちらつき現象について
- MacBook Air M2で4K60Hz外部ディスプレイを使用する方法
- Ryzen 7040HS Phoenix搭載LinuxマシンのGPUドライバー設定ガイド
- 注目を集める新星Gleam言語!Elixirとの違いから見る特徴と可能性
- DellとHP、買うならどっちがマシ?徹底比較ガイド
- サブドメインのメリット・デメリットを徹底解説!
- 中古ドメインって実際どうなの?メリット・デメリットを解説
- ノートパソコン バッテリー持ち ランキング【2024年4月】徹底比較!
- なぜ安い?workドメインが安価な理由を徹底解説!
- メキシコペソ投資ってどうなの?過去データで見る特徴とリスク
- なぜ私がトルコリラ投資をおすすめしないのか – データで見る実態と注意点
- 【2024年4月最新】世界の通貨別金利ランキング!今一番利回りが高い通貨はコレだ!
- 金利5%台!?米ドル保有で高金利を受け取る方法
- axumのルーティングを整理して別ファイルに分ける方法
- Acitx-webとAxumってどっちがいいの?RustのWebフレームワーク比較
- 次期C#?注目のプログラミング言語F#を徹底解説
- 電気ストーブと石油ストーブはどっちがいい?費用や特徴を徹底比較!
- ゲーミングキーボードって正直あんまり変わらないよねって話
- 【2024年版】今後はやるマイナープログラミング言語5選|現役エンジニアが解説
- Rustの現状の課題と発展途上な部分
- 私がRustがC++より優れていると感じる理由
- Rustプログラミング言語完全学習ロードマップ【2024年版】
- おすすめプログラミングスクール比較【2024年版】現役エンジニアが徹底解説