Open10

Typescriptの勉強

kentkent

const f = (n:number, d:number): Promise<number> => {...}
戻り値にPromise<number>が指定されている。→ <number>は総称型(ジェネリクス)→ 「numberの値が結果として渡されるPromiseが戻り値として返されるようになる」 → ちょっとわからん

kentkent

return文の中身
return new Promise((f)=>{...})
「引数のfは、事後処理として実行される関数が値として渡されます。」
「この関数には、numberの値を引数として持つものが設定されます。なぜなら、Promise<number>というように、このPromiseではnumberの値が返されるように指定しているからです。」

kentkent

f(10,100).then(cb)
「thenの引数に用意した処理は、非同期処理が完了したあとで実行されることになります。このことから、こうした処理を 「コールバック」 と呼びます。

kentkent
type person = {readonly name:string, mail?:string, age?:number, print:()=>void}
  • 引数や変数では、名前の後に?をつけえることでオプションを指定(=nullを許容)できる
  • readonlyをnameに指定→値の読み取りのみ(書き込み禁止)になる
kentkent

列挙型(enum)について

多数の値の中から一つを選ぶとき、たとえば三つの値だけしか選べない型が欲しくなる。これを実現するのが「enum」型

enum janken { goo, choki, paa }

const you = janken.goo

swith(you){
 case janken.goo:
 console.log("あいこ");
 break
 case janken.choki:
 console.log("勝ち");
 break
 case janken.paa:
 console.log("負け");
 break
}

テキストで得られるenum

enum School {junior, juniorHigh, high, other}

このままconsole.logすると0,1,2,3という数字になる
しかし以下のように書くことで、指定されたテキストが値として使われるようになる。

enum School{
 junior = "junior",
 juniorHigh = "juniorHigh"
 high = "high"
 other = "other"
}

let grade = Shool.high
console.log(grade)
// "high" 
kentkent

クラスを拡張する仕組み

  • インターフェイス
  • 抽象クラス
  • 静的メンバー
  • パラメータプロパティ
  • 総称型(ジェネリクス)の使用
  • ユーティリティ型の利用
kentkent

ジェネリクス(総称型)について

  • 「any型のようにどのような値でも受け付けるが、受け付ける型に応じて、その内部や戻り値で使われる型が規定される」

クラスへのジェネリクス(総称型)の適用

class Data<T> {
    data? :T[]

    constructor(...item:T[]) {
        this.data = item
    }

    print():void{
        if (this.data){
            for(let item of this.data){
                console.log(item)
            }
        } else {
            console.log("no data...")
        }
    }
}

const data1 = new Data<string>("one", "two", "three")
const data2 = new Data<number>(123,456,78,90)
data1.print()
data2.print()
kentkent

ユーティリティ型について

ユーティリティ型とは

TypeScript comes with a large number of types that can help with some common type manipulation, usually referred to as utility types.[1]

ユーティリティ型の例

type data = [string, number]
type ReqData = Readonly<data> // Readonlyユーティリティ型の使用

const x:data = ["taro", 39]
const y:ReqData = ["hanako", 28]

x[1] = 28
y[1] = 17 // エラーになる
// Cannot assign to '1' because it is a read-only property.

クラスにおけるユーティリティ型の利用例

type Human = {
 name:string
 mail?:string
 age?:number
}

class Person{
 human: Required<Human> // Requiredユーティリティ型の使用 → mailやageの?(オプション指定)が無効になる
 constructor(...){...}
}

ジェネリクスとユーティリティ型

  • ユーティリティはジェネリクス(総称型)
  • <>に型を指定することで、その型に性質を付与した新しい型が用意されるものと考えられる

代表的なユーティリティ型

  • Readonly<T>:変更不可にする
  • Required<T>:必須項目(オプション不可)にする
  • Partial<T>:すべてオプションにする
脚注
  1. https://www.w3schools.com/typescript/typescript_utility_types.php ↩︎

kentkent

ユニオン型について

「ユニオン型の値では、利用するすべてのクラスに共通するプロパティとメソッドが「ユニオン型の機能」として認識されるようになります。」→よくわからない。