TS for OOP Programmersを読んでから


TypeScript for OOP Programmers


タイプスクリプトをもっと詳しく知りたいので、それを読みました.
C#が一番詳しいので、for OOP Programmersを選びました.
次は読み終わってから整理します.

集合タイプ


タイプスクリプトに初めて触れたとき、タイプスクリプトのタイプもC#のデータ型やクラスと同じだと思います.
タイプスクリプトを検索すると、C#を作成した人が開発に参加していることがわかり、もっと似ていると思います.
ただし、タイプスクリプトでは、タイプAまたはタイプBのunionタイプである可能性があり、複数のタイプを組み合わせたクロスタイプである可能性があるため、混乱が生じる.
マニュアルでは、タイプスクリプトのタイプをコレクションと見なすことをお勧めします.
タイプはコレクションであるため、1つの値が複数のコレクションに同時に属することができます.
例えば、stringセットおよびnumberセットに属することができる値は、string|numberセットに属する値で記述することができる.
C#には比較的自由に使えるタイプのobject、var、dynamicもありますが、複数のタイプを同時に持つことができないのが印象的でした.

Structural. not Nominal


タイプスクリプトのオブジェクトには、単一のタイプはないと言われています.
タイプスクリプトのタイプシステムは、名義システムではなく構造化システムと呼ばれます.
interface Pointlike {
  x: number;
  y: number;
}
interface Named {
  name: string;
}

function printPoint(point: Pointlike) {
  console.log("x = " + point.x + ", y = " + point.y);
}

function printName(x: Named) {
  console.log("Hello, " + x.name);
}

const obj = {
  x: 0,
  y: 0,
  name: "Origin",
};

printPoint(obj);
printName(obj);
まず、objオブジェクトは、名目タイプシステムの観点からprintPoint、printName関数のパラメータとして使用できません.
objオブジェクトのタイプはPointlikeまたはNameではないためです.
構造型システムの観点から、objオブジェクトはprintPoint、printName関数のパラメータであってもよい.
objオブジェクトには、Pointlikeのx、y属性、およびName属性があるからです.
頭を殴られたような気がします.
これは本当に賢い方法だと思います.
これは名目型システムの暗示型変換のように効果的だと思います.
class Empty {}

function fn(arg: Empty) {
  // do something?
}

// No error, but this isn't an 'Empty' ?
fn({ k: 10 });
このハーモニーも面白い
パラメータのタイプはEmpty、パラメータのタイプは{k:number;}はい.
パラメータタイプにはEmptyタイプが含まれているため、正常に動作しています.
これらを前述の比喩集合として解釈すると、パラメータタイプはパラメータタイプの部分集合である.
構造化システムを説明する驚くべき例もある.
class Car {
  drive() {
    // hit the gas
  }
}
class Golfer {
  drive() {
    // hit the ball far
  }
}
// No error?
let w: Car = new Golfer();
2つのクラスは名前が異なりますが、構造は同じです.
最後の行のように初期化できます
良いコードではなく、使えませんが、構造化タイプのシステムを理解するのに役立つ良い例だと思います.

typeof

class Car {}

typeof(new Car()) // result: "object"
構造化タイプシステムでは、実行時にtypeofを使用してタイプを取得することはできません.

の最後の部分


意外と多くのことを学びました.
読んでよかった
手書きの残りの章を見て、どれだけ新しいものが見えるか知りたいです.