টাইপস্ক্রিপ্ট হ্যান্ডবুকটিতে বর্তমানে তীর ফাংশনে কিছুই নেই। সাধারণ ফাংশনগুলি সাধারণভাবে এই সিনট্যাক্সের সাথে টাইপ করা যায়: উদাহরণস্বরূপ:
function identity<T>(arg: T): T {
return arg;
}
তীর ফাংশনগুলির সিনট্যাক্স কী?
টাইপস্ক্রিপ্ট হ্যান্ডবুকটিতে বর্তমানে তীর ফাংশনে কিছুই নেই। সাধারণ ফাংশনগুলি সাধারণভাবে এই সিনট্যাক্সের সাথে টাইপ করা যায়: উদাহরণস্বরূপ:
function identity<T>(arg: T): T {
return arg;
}
তীর ফাংশনগুলির সিনট্যাক্স কী?
উত্তর:
রবিন রেফারেন্সযুক্ত সিনট্যাক্স ব্যাখ্যা করার পুরো উদাহরণটি এটি আমার জন্য ঘরে এনেছে:
নীচের মত কিছু ঠিকঠাক কাজ করে:
function foo<T>(x: T): T { return x; }
তবে একটি তীর জেনেরিক ফাংশন ব্যবহার করা তা করবে না:
const foo = <T>(x: T) => x; // ERROR : unclosed `T` tag
কার্যকারণ: কম্পাইলারটি ইঙ্গিত করতে যে জেনেরিক প্যারামিটার ব্যবহার করে তা জেনেরিক, যেমন:
const foo = <T extends unknown>(x: T) => x;
GenericFun<T, A=T> অন্তর্ভুক্ত এমন একটি সেট নির্ধারণ করে। জেনেরিক টাইপগুলি সরাসরি একটি টাইপ টীকাটি তৈরি করার অনুমতি দেয় - উদাহরণস্বরূপ কনস্ট - তবে নির্দিষ্টকরণের প্রয়োজনে যেমন সরবরাহ করা স্থির নিরাপত্তাটি নষ্ট করবে বা যেমন GenericFun<number>GenericFun<string>const foo: GenericFunconst foo: GenericFun<string>const foo: GenericFun<number>
.tsxফাইলের মধ্যে কেবল একটি ত্রুটি (টাইপস্ক্রিপ্ট + জেএসএক্স)। একটি .tsফাইল এটা কাজ করে জরিমানা, যেমন আপনার উপর দেখতে পারেন টাইপ করা বিষয় খেলার মাঠ ।
const foo = <T,>(x: T) => x;স্ক্রিপ্ট সংকলকগুলি জেএসএক্স দ্বিপাক্ষিকে পাশ কাটাতে পিছনে কমা সমর্থন করে ।
আমি বিভ্রান্তিকর উপরের উদাহরণটি পেয়েছি। আমি প্রতিক্রিয়া এবং জেএসএক্স ব্যবহার করছি তাই আমার মনে হয় এটি দৃশ্যের জটিল।
আমি টাইপস্ক্রিপ্ট ডিপ ডাইভের কাছ থেকে স্পষ্টতা পেয়েছি , যা তীর জেনেরিকের জন্য উল্লেখ করেছে:
কার্যকারণ: কম্পাইলারটি ইঙ্গিত করার জন্য যে জেনেরিক পরামিতি ব্যবহার করে তা জেনেরিক হয়, এটি একটি সহজ উদাহরণ থেকে আসে যা আমাকে সাহায্য করেছিল।
const identity = < T extends {} >(arg: T): T => { return arg; }
আপনি যদি কোনও .tsxফাইলে থাকেন তবে আপনি কেবল লিখতে পারবেন না <T>, তবে এটি কাজ করে:
const foo = <T, >(x: T) => x;
extends {}হ্যাকের বিপরীতে , এই হ্যাকটি অন্তত উদ্দেশ্যটি সংরক্ষণ করে।
const foo = <T = any,>(x: T) => xকাজ করে না ...
ভাষার স্পেসিফিকেশন p.64f এ বলেছে
<টি> (...) => {... form ফর্মের একটি গঠন একটি তীর ফাংশন এক্সপ্রেশন হিসাবে টাইপ প্যারামিটার বা কোনও টাইপ প্যারামিটার ছাড়াই একটি তীর ফাংশনে প্রয়োগ করা যেতে পারে type এটি পূর্বের হিসাবে সমাধান করা [..]
উদাহরণ:
// 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})
});
};
এটি আমার পক্ষে কাজ করে
const Generic = <T> (value: T) => {
return value;
}
.tsফাইল এই কাজ করে। অন্যথায় এক প্রসারিত করতে হবে।
extends {}কাজের সাথে জনপ্রিয় উত্তর এবং এর চেয়ে ভাল extends any, এটি Tএকটি বস্তু হতে বাধ্য করে
const foo = <T extends {}>(x: T) => x;
এড়াতে এবং ধরণ-সুরক্ষা সংরক্ষণ করতে, আপনি extends unknownপরিবর্তে ব্যবহার করতে পারেন
const foo = <T extends unknown>(x: T) => x;
আমি এই ধরণের ঘোষণাটি ব্যবহার করতে চাই:
const identity: { <T>(arg: T): T } = (arg) => arg;
এটি আপনার ফাংশনে অতিরিক্ত প্রপস সংজ্ঞায়িত করার অনুমতি দেয় যদি আপনার কখনও প্রয়োজন হয় এবং কিছু ক্ষেত্রে এটি জেনেরিক সংজ্ঞা থেকে ফাংশন বডি ক্লিনার রাখতে সহায়তা করে।
আপনার যদি অতিরিক্ত প্রপসের প্রয়োজন নেই (নামের জায়গার সাজানোর জিনিস) তবে এটি সরল করে দেওয়া যেতে পারে:
const identity: <T>(arg: T) => T = (arg) => arg;
এত দেরীতে, তবে 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)
<T, >। @jbmilgrom 'উত্তর অধীনে @Thomas মন্তব্যে বর্ণনা অনুযায়ী
const fooকি কিছু পূর্বনির্ধারিত জেনেরিক প্রকারের ঘোষণা করা সম্ভব হবে ? অর্থাতtype GenericFun<T, A=T> = (payload: A) => T;তারপর করাconst foo: GenericFunএখনও একটি প্রদান না করেই জেনেরিকTধরনের?