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 T | Variance | Ví dụ |
|---|---|---|
| Chỉ đầu ra (return, readonly) | covariant | ReadonlyArray<T>, () => T |
| Chỉ đầu vào (tham số) | contravariant | (x: T) => void |
| Cả vào lẫn ra | invariant | T[] (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ápm(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.