TypeScript 基礎から 勉強メモ

雰囲気で書いてたので改めて基礎の基礎をおさえる。

超絶参考記事

https://qiita.com/k-penguin-sato/items/72b21d4bfb631665c342

 キーワード「静的型付け」「インターフェース」「クラスベースオブジェクト指向」「Generics(ジェネリックス)」

# 「静的型付け」

const lastName : string = 'tanaka' // コンパイル後のコードには型定義の部分はなくなる
const firstName : number = 'taro' // コンパイルエラー

# 「インターフェース」

静的型付けのオブジェクトバージョンみたいなもので構造ごとチェックしてくれる。

// コンパイルするとこの記述は残らない
interface Person {
 name: string;
 age: number;
}

// Personインターフェースを型として使用。構造が違うものが来るとエラー。
function intro(person:Person): string {
 return `My name is ${person.name}. I am ${person.age}!`
}

// Personインターフェースの構造に従う変数を定義
var ken = {
 name: 'Ken',
 age: 20
}

# クラスベースオブジェクト指向

なんかこんなかんじらしい。あんまりクラスベースで書かないのでとりあえずざっくりと。もちろん継承もできる。

class Menu {
 items: Array<string>; //文字列の配列を表します。
 pages: number
 constructor(item_list: Array<string>, total_pages: number) {
   this.items = item_list;
   this.pages = total_pages;
 }
 // Method
  list(): void {
    console.log("Our menu for today:");
    for(var i=0; i<this.items.length; i++) {
      console.log(this.items[i]);
    }
  }
}

# Generics(ジェネリックス)

Javaのそれと同じような考え方でいいらしい

Genericsは抽象的な型引数を使用して、実際に利用されるまで型が確定しないクラス・関数・インターフェイスを実現する為に使用されます。

これを

// number型
function test(arg: number): number {
 return arg;
}
// string型
function test2(arg: string): string {
 return arg;
}
test(1); //=> 1
test2("文字列"); //=> 文字列

こうかけますよと

function test<T>(arg: T): T {
 return arg;
}
test<number>(1); //=> 1
test<string>("文字列"); //=> 文字列
//※ Genericsでも型推論ができるので、引数から型が明示的にわかる場合は省略が可能
test("文字列2"); //=> "文字列2"
抽象的な型引数<T>を関数に与え、実際に利用されるまで型が確定しない関数を作成する

複数の型やインターフェースにも利用可能。また以下のように制約付きでも書ける。

function getName<T>(arg: T): string {
 return arg.name; // Property 'name' does not exist on type 'T'.
}
// argの型はこの時点でnameを持つか不明なので、コンパイラは警告を出す。

↓
↓
↓

interface argTypes {
 name: string;
}

function getName<T extends argTypes>(arg: T): string {
 return arg.name;
}
// インタフェースを満たす型であることを指定できる
// 呼び出されるまではエラーにならないので実装できる

getName({ name: "鈴木一郎" });



PS.最近ワンボーロン調子よくてうれしい

いいなと思ったら応援しよう!