TypeScrip: أوه ، نظام الكتابة هذا مضحك

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













العلاقات صعبة



من السهل جدًا التحقق مما إذا كان أحد الأنواع نوعًا فرعيًا من نوع آخر باستخدام الطباع:







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



يكسر القاع بكل معنى الكلمة. مصير من يقابله وجها لوجه صعب ...













كل الكود من المقال.







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














All Articles