مرحبًا ، اسمي دميتري كارلوفسكي ، وقد عقدت مؤخرًا مع أرتور موكمينوف ورشة عمل حيث أوضحت كيفية تطوير وظائف معقدة من خلال الاختبار . هذه ساعتان من البرمجة القاسية. لذلك ، كإعلان تشويقي ، يمكنك الحصول على تحليل لفضول نظام الكتابة المطبوعة.

العلاقات صعبة
من السهل جدًا التحقق مما إذا كان أحد الأنواع نوعًا فرعيًا من نوع آخر باستخدام الطباع:
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
.
لكن ما الذي يلوح في الأفق بجانبهم؟ نعم هو كذلك any
! من ناحية ، يمكن استبدالها تمامًا بـ unknown
:
type unknown_is_any = Assert< unknown, any >
ولكن من ناحية أخرى ، مثل قطة شرودنغر ، فهي نوع فرعي never
(ونتيجة لذلك ، من أي نوع آخر من أنواع ال فعل unknown
) وهي ليست كذلك في نفس الوقت:
type any_maybe_extends_never = Assert< any extends never ? true : false, true | false >
باختصار ، إنه any
يكسر القاع بكل معنى الكلمة. مصير من يقابله وجها لوجه صعب ...

سعيد يا رفاق التصحيح!
