Π― ΠΎΠ±ΠΎΠΆΠ°Ρ Union Type, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ΠΈ Π΄Π°ΡΡ Π½Π΅Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΠ·Π±Π°Π²Π»ΡΡΡΡΡ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΠΠ ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌΠ°, Π·Π°ΡΡΠ΅Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Pattern Matching:
type UnactivatedUser = { email: string; password: null; activated: false; }
type ActivatedUser = { email: string; password: string; activated: true; }
type User = UnactivatedUser | ActivatedUser // Π²ΠΎΡ ΡΡΠΎ union type
function someFn(user: User) {
switch(typeof user) { // ΡΡΠΎ Pattern Matching
case UnactivatedUser:
throw new Error("User must be activated")
case ActivatedUser:
return true
default:
safeGuard(user) // Π΅ΡΠ»ΠΈ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ ΠΊ User, ΡΠΎ Π²ΠΎΡ Π·Π΄Π΅ΡΡ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΡΡΠΎ ΠΌΡ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½Π° Π½Π΅Π³ΠΎ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ case
}
}
Π‘ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡΠΌΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π½Π° TS, Rust ΠΈ Haskell.
Π Π²ΠΎΡ Π² Go ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ... ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ»-Π²Π΅ ΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ interface ΠΈ ΠΌΡΠ΄ΡΠΈΡΡ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π° ΠΌΠ΅ΡΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠΈΠΏ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ
Union Type ΠΈ Pattern Matching Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈ, ΡΡΠΎ Ρ ΡΠ΄Π΅Π»Π°Π» ΠΈΡ
ΡΠ°ΡΡΡΡ Π€ΠΠ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΡΠ°ΠΊΠΆΠ΅ Π΄Π°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Algebraic Data Types
βΒ
https://fop.davidshekunts.ru/#d04ae9b9e8e24f3ab46144f1e8816fc2βΒ
https://itnext.io/practical-introduction-to-algebraic-datatypes-adts-in-typescript-1cb6952e4c6dβΒ
https://wiki.haskell.org/OOP_vs_type_classesβ
https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html