TypeScript の Interface の関数定義の variant
経緯
以下のように Intereface を用意して DI をしようと思ったが、想定どおりに型エラーがでない
code:TypeScript
interface Ihoge {
run(args: string | number): void
}
class Hoge implements Ihoge {
run(_args: string) {} // IHoge の制約を満たしていないので型エラーになってほしいがならない(悲しい)
}
結論
Arrow 型の関数定義で書く
code:TypeScript
interface Ihoge {
run: (args: string | number) => void
}
class Hoge implements Ihoge {
run(_args: string) {} // Type error !! (嬉しい)
}
解説
TypeScript の method 型の関数を定義すると型の variant が Bivariant になってしまう
型の互換性を Contravariant にするためには tsconfig の strictFunctionTypes を有効化した上で arrow 型の関数定義でないといけない
余談
とはいえ interface を implements するとはどういうことなのかよく理解できていない
色々見たもの