概要
typescriptのinterface
についてよくわからなかったので調べてみる。
interfaceとは?
interface
とは、クラスが実装すべきフィールドやメソッドを定義した型。
クラスはインターフェースを実装することで、型のルールを作れて、チェックが可能になる。
JavaやPHPなどで使われているが、JavaScriptにはないため、TypeScriptで可能となった。
TypeScriptでのインターフェースの役割はコンパイル時の型チェックであり、JavaScript実行時には影響がない。
名前的型付けと構造的型付け
型の区別や互換性の判定をする型システムには以下二つが存在
型付け | 概要 |
---|---|
名前的型付け | 型の名前に基づいて型の区別を行う。 |
構造的型付け | 型の構造に基づいて型の区別や互換性を判定する。 |
名前的型付け
型の名前に基づいて型の区別を行うシステム。
string
型とnumber
型は名前が異なるため、異なる方として扱われる。
クラスPerson
型とDog
型も同様に名前が異なるため、異なる方として扱われ、互換性もないものと判断される。
Java, PHP, C#, Swift等で採用されている。
構造的型付け
型の名前ではなく、その構造に注目して区別、互換性の判定がされる。
この方法では、型が持つプロパティやメソッドの構造が同一であれば、名前が異なっている型同士でも互換性があるものとみなされる。
以下Person
クラスとDog
クラスでは、共にwalkメソッドを1つ持っているという同一の構造となっている。
この場合、Person
とDog
は互換性があるものとして判定される。
class Person {
walk() {}
}
class Dog {
walk() {}
}
まとめ
名前的型付け | 構造的型付け | |
---|---|---|
型の区別基準 | 型の名前 | 型の構造 |
互換性の判定 | 名前が同じであれば互換性あり | 構造が同じであれば互換性あり |
主な採用言語 | Java, C#, Swift, PHPなど | TypeScript, Goなど |