概要
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など |