常識的には、サブタイプは戻り値の型に関しては共変であるが、引数の型に関しては反変でなければならないことを示唆しています。したがって、 の引数の型が厳密に共変であるため、次のものは拒否する必要がありますE.f
。
interface C {
f (o: C): void
}
interface D extends C {
g (): void // give D an extra service
}
class E implements C {
// implement f with a version which makes stronger assumptions
f (o: D): void {
o.g() // rely on the extra service promised by D
}
}
// E doesn't provide the service required, but E.f will accept
// an E argument as long as I invoke it via C.
var c: C = new E()
console.log('Try this: ' + c.f(c))
実際、プログラムを実行すると印刷されます
Uncaught TypeError: o.g is not a function
だから:(1)ここでの理論的根拠は何ですか(おそらく1つあると思われますが、満足のいくものではなく、JavaScriptyです)。(2)この状況でコンパイラが警告を省略できない実際的な理由はありますか?