Halo, nama saya Dmitry Karlovsky dan baru-baru ini saya, bersama dengan Artur Mukminov , mengadakan lokakarya di mana saya menunjukkan bagaimana mengembangkan fungsi-fungsi yang kompleks melalui pengujian . Ini adalah 2 jam pemrograman tipe kasar. Jadi sebagai penggoda, tangkap analisis keingintahuan dari sistem tipe naskah ketikan.

Hubungan itu sulit
Sangat mudah untuk memeriksa apakah satu jenis adalah subtipe dari yang lain menggunakan mesin ketik:
type IsAExtendsB = A extends B ? true : false
Classify, 2 4 :
[ A, '<:', B ]
β A B.[ A, ':>', B ]
β B A.[ A, '==', B ]
β ( ).[ A, '!=', B ]
β .
, Equal Assert, , , . Assert , .
! ..
β Object
object
β , , :
type boolean_is_Object = Assert< boolean extends Object ? true : false, true > type boolean_is_not_object = Assert< boolean extends object ? true : false, false >
, , , :
type Object_vs_object = Assert< Classify< Object, object >, [ Object, '==', object ] >
: (, boolean
) (, Object
), β (, object
), β .
, . Object
, object
.
, , β , :
type boolean_is_true_or_false = Assert< boolean, true | false >
:
enum FL4 { Absurd, False, True, Unknown } type FL4_is_union = Assert< FL4, | FL4.Absurd | FL4.False | FL4.True | FL4.Unknown >
( ):
type Absurd_is_number = Assert< Classify< FL4.Absurd, number >, [ FL4.Absurd, '==', number ] >
:
type Absurd_is_never_wtf = Assert< Classify< FL4.Absurd, 0 >, [ never, '<:', 0 ] >
, , ? , !
type One_is_never_wtf = Assert< Classify< FL4.Absurd, 1 >, [ FL4.Absurd, ':>', never ] >
, , !
, β , :
enum FL3 { Absurd, False, True } type Absurd_is_not_Absurd = Assert< Equal< FL3.Absurd, FL4.Absurd > | false, false >
, . , , , :
enum HappyDebugging { False = "True", True = "False", } type True_extends_string = Assert< Classify< HappyDebugging.True, string >, [ HappyDebugging.True, '<:', string ] >
, number
, string
.
, :
never
. , .unknown
β . .unknown
.
Tapi apa yang membayang di sebelah mereka? Ya itu any
! Di satu sisi, ini sepenuhnya dapat dipertukarkan dengan unknown
:
type unknown_is_any = Assert< unknown, any >
Tetapi di sisi lain, seperti kucing SchrΓΆdinger, ini adalah subtipe never
(dan, sebagai konsekuensinya, dari jenis do lainnya unknown
) dan tidak pada saat yang sama:
type any_maybe_extends_never = Assert< any extends never ? true : false, true | false >
Singkatnya, itu any
menerobos dasar dalam segala hal. Nasib mereka yang bertatap muka dengan dia sulit ...

Selamat debugging guys!
