フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

TypeScriptのInterface①

Interface

  • TypeScriptの主要な原則の1つは、型チェックが値の形に焦点を当てることです。これは、「ダックタイピング」または「構造サブタイピング」と呼ばれることもあります。 TypeScriptでは、インターフェイスはこれらの型に名前を付ける役割を果たし、コード内のコントラクトやプロジェクト外のコードとのコントラクトを定義する強力な方法です。
  • オブジェクトのみのタイプエリアス(データ型に別名をつけることができます)
  • オブジェクトの構造を現したものがインターフェース
  • タイプエリアスとの違いはInterfaceはオブジェクトのみで利用できる。

www.typescriptlang.org

インターフェースにメソッドを追加

interface Personal {
    name: string;
    age: number;
  ## メソッドの定義する
    greeting(message: string): void;
}

const personal: Person ={
    name: 'Taro',
    age: 42,
    ## インターフェースで指定したメソッドを利用する
    greeting(message: string) {
        console.log(message)
    }
}

implements

  • Classに対してインターフェースの条件を適用する
  • Classとインターフェースを同時に利用するときにimplementsを使う
  • abstractに近しいが、interfaceとの違いは実装されているか、されていないかの違いがある。
  • 1つのクラスに複数のinterfaceを定義することが出来る。
  • interfaceを定義したclassのプロパティはpublicまたはreadonlyを指定する必要がある。privateやprotectedはエラーになる
interface Personal {
    name: string;
    age: number;
    greeting(message: string): void;
}

class Engineer implements Personal {
    constructor(public name: string, public age: number, public skill: string) {

    }
    greeting(message: string) {
        console.log('こんにちは!')
    }
}

const enginner = new Engineer('Yamda', 50, 'Ruby')
console.log(enginner)
  • typeエリアスの場合、interface同様にimplementsに指定して利用することが出来る
type Personal = {
    name: string;
    age: number;
    greeting(message: string): void;
}

構造的部分型

  • 構造的部分型を指定すると、interfaceで利用できるプロパティおよびメソッドのみ利用できるインスタンスが生成される
  • 下記のサンプルの場合、EngineerにskillというプロパティがあってもPersonalの構造的部分型をしていするとskillプロパティにアクセスすることができない。
interface Personal {
    name: string;
    age: number;
    greeting(message: string): void;
}

class Engineer implements Personal {
    constructor(public name: string, public age: number, public skill: string) {

    }
    greeting(message: string) {
        console.log('こんにちは!')
    }
}

# 構造的部分型
const enginner: Personal = new Engineer('Yamda', 50, 'Ruby')
console.log(enginner)

f:id:PX-WING:20200715234002p:plain