</>
⌕
Senior #variance#covariance#contravariance#soundness

Variance: covariance, contravariance, invariance trong TypeScript

⚡ Trả lời nhanh

Covariance: `Box<Dog>` gán được cho `Box<Animal>` (vị trí đầu ra/chỉ đọc). Contravariance: tham số hàm đảo chiều, `(a: Animal) => void` gán được cho `(d: Dog) => void` (bật bằng `strictFunctionTypes`). Invariance: cần cả hai chiều. TS cố ý lỏng với mảng và method (bivariant) nên không hoàn toàn sound.

Ví dụ: mảng covariant không an toàn

main.ts · sửa được

Quy tắc

Vị trí của TVarianceVí dụ
Chỉ đầu ra (return, readonly)covariantReadonlyArray<T>, () => T
Chỉ đầu vào (tham số)contravariant(x: T) => void
Cả vào lẫn rainvariantT[] (lý thuyết), { get(): T; set(v: T): void }
  • Với strictFunctionTypes, tham số của function type được kiểm tra contravariant; nhưng method (cú pháp m(x: T): void) vẫn bivariant để tương thích với mảng và DOM.
  • TS 4.7 cho annotation tường minh trên generic: interface Producer<out T>, Consumer<in T>, Both<in out T>, giúp kiểm tra nhanh và khai báo ý định.
  • Quy tắc nhớ: producer (đọc) covariant, consumer (ghi/nhận) contravariant.
🃏 Ôn bằng flashcard