ما هي صياغة دوال الأسهم في تايبسكريبت مع الأنواع العامة؟
لا يحتوي دليل TypeScript حالياً على أي شيء عن دوال السهم. يمكن كتابة دوال عادية بأنواع عامة باستخدام هذا الصياغة: مثال:
function identity<T>(arg: T): T {
return arg;
}
ما هو بناء الجملة للدوال السهمية؟
الإجابة رقم 1
تحرير
وفقًا لتعليق @Thomas، في مُترجمات TS الأحدث، يمكننا ببساطة القيام بما يلي:
const foo = <T,>(x: T) => x;
الإجابة الأصلية
المثال الكامل الذي يشرح البنية التي أشار إليها روبن... وضحها لي تمامًا:
دوال عامة
شيء مثل ما يلي يعمل بشكل جيد:
function foo<T>(x: T): T { return x; }
ومع ذلك، استخدام دالة عامة سهمية لن يفعل:
const foo = <T>(x: T) => x; // ERROR : unclosed `T` tag
حل بديل: استخدم extends على المعامل العام للإشارة إلى المترجم بأنه عام، على سبيل المثال:
const foo = <T extends unknown>(x: T) => x;
الإجابة رقم 2
إذا كنت في ملف .tsx لا يمكنك فقط كتابة <T>، ولكن هذا ينفع:
const foo = <T, >(x: T) => x;
على عكس خدعة extends {}، فإن هذه الخدعة على الأقل تحافظ على الهدف.
الإجابة رقم 3
لقد وجدت المثال أعلاه محيرًا. أنا أستخدم React و JSX لذلك أعتقد أنه أعقد السيناريو.
حصلت على توضيح من كتاب TypeScript Deep Dive، الذي ينص على ما يلي بالنسبة للنوعيات السهمية:
الحل البديل: استخدم extends على المعامل العام للإشارة إلى المترجم أنه عام، جاء هذا من مثال أبسط ساعدني.
const identity = < T extends {} >(arg: T): T => { return arg; }
الإجابة رقم 4
هذا يناسبني
const Generic = <T> (value: T) => {
return value;
}
الإجابة رقم 5
تقول مواصفة اللغة في الصفحتين 64 وما يليها
يمكن تحليل بنية على شكل < T > ( ... ) => { ... } كتعبيـر دالة سهمية مع معلمة نوع أو كتحقق نوع مطبق على دالة سهمية بدون معلمة نوع. ويتم حلها كالحالة الأولى[..]
مثال :
// helper function needed because Backbone-couchdb's sync does not return a jqxhr
let fetched = <
R extends Backbone.Collection<any> >(c:R) => {
return new Promise(function (fulfill, reject) {
c.fetch({reset: true, success: fulfill, error: reject})
});
};
الإجابة رقم 6
متأخر جدًا، ولكن مع ES6 لا حاجة للتمديد، فهو لا يزال يعمل بالنسبة لي.... :)
let getArray = <T>(items: T[]): T[] => {
return new Array<T>().concat(items)
}
let myNumArr = getArray<number>([100, 200, 300]);
let myStrArr = getArray<string>(["Hello", "World"]);
myNumArr.push(1)
console.log(myNumArr)
الإجابة رقم 7
هذا يناسبني
const logSomething = <T>(something:T): T => {
return something;
}
الإجابة رقم 8
أستخدم هذا النوع من الإعلان:
const identity: { <T>(arg: T): T } = (arg) => arg;
يتيح تعريف الخصائص الإضافية لدالتك إذا احتجت لذلك يومًا، وفي بعض الحالات، يساعد في الحفاظ على نظافة جسم الدالة من التعريف العام.
إذا لم تكن بحاجة إلى الخصائص الإضافية (نوع من فرز المساحات)، يمكن تبسيطها إلى:
const identity: <T>(arg: T) => T = (arg) => arg;
الإجابة رقم 9
بينما الجواب الشائع مع extends {} يعمل وهو أفضل من extends any، إلا أنه يجبر T أن يكون كائنًا
const foo = <T extends {}>(x: T) => x;
لتجنب هذا والحفاظ على أمان النوع، يمكنك استخدام extends unknown بدلاً من ذلك
const foo = <T extends unknown>(x: T) => x;
الإجابة رقم 10
الطريقة بدون دالة السهم. توسيع المثال من المنشور الأصلي.
function foo<T>(abc: T): T {
console.log(abc);
return abc;
}
const x = { abc: 123 };
foo(x);
const y = 123;
foo<number>(y);
بجانب إجابة تضمين كل شيء في بيان واحد:
const yar = <T,>(abc: T) => {
console.log(abc);
return abc;
}
نهج آخر هو وجود نوع وسيط:
type XX = <T>(abc: T) => T;
const bar: XX = (abc) => {
console.log(abc);
return abc;
}
ملعب
