كيفية إنشاء عامل جمع عام في TypeScript يعمل مع الأرقام والسلاسل
أثناء تعلمي عن الأنواع العامة في TypeScript، أردت محاولة إعادة إنشاء الجافاسكريبت التالي:
function add(x, y){
return x + y;
}
حاولت مثل:
type StringOrNumber = string | number;
function add<MyType extends StringOrNumber>(x: MyType, y: MyType): MyType {
return x + y;
}
هذا يخطئ بـ:
error TS2365: Operator '+' cannot be applied to types 'MyType' and 'MyType'.
لماذا لا يعمل هذا؟ أفترض أن MyType يمكن أن يكون إما نصًا أو رقمًا، ومتى تم "اختياره" سيعرف TypeScript أنه إما يجمع نصين أو رقمين.
الإجابة رقم 1
حالة قد تحدث أيضًا هي أن MyType يمكن أن تكون string | number والتي تمتد على StringOrNumber. على سبيل المثال add<string | number>(''، 1); هو استدعاء صالح تمامًا للدالة بالتوقيع الذي قمت بتعريفه. امتداد نوع لنوع اتحاد لا يعني "اختر واحدًا بالضبط".
بما أن توقيعك منطقي وأنت تتعلم عن الأنواع العامة (generics) لذلك نريد الالتزام به، يمكننا أيضًا إيقاف فحص النوع في تلك النقطة. أحيانًا لا يستطيع TypeScript حقًا فهم السيناريو المعقد الخاص بك وتظل لديك خيار واحد فقط وهو return (x as any) + y للتخلي عن فحص النوع في تلك النقطة.
طريقة أخرى للتعامل مع هذا النوع من الحالات هي باستخدام توقيعات محملة مثل التالية
function add(x: string, y: string): string;
function add(x: number, y: number): number;
function add(x: any, y: any): any {
return x + y;
}
const t1: string = add(10, 1); // Type 'number' is not assignable to type 'string'.
const t2: number = add(10, 1); // OK
const t3: string = add('10', '1'); // OK
const t4: number = add('10', 1); // Argument of type '"10"' is not assignable to parameter of type 'number'.
