জেনেরিক সহ টাইপস্ক্রিপ্ট তীর ফাংশনগুলির সিনট্যাক্সটি কী?


192

টাইপস্ক্রিপ্ট হ্যান্ডবুকটিতে বর্তমানে তীর ফাংশনে কিছুই নেই। সাধারণ ফাংশনগুলি সাধারণভাবে এই সিনট্যাক্সের সাথে টাইপ করা যায়: উদাহরণস্বরূপ:

function identity<T>(arg: T): T {
    return arg;
}

তীর ফাংশনগুলির সিনট্যাক্স কী?

উত্তর:


231

রবিন রেফারেন্সযুক্ত সিনট্যাক্স ব্যাখ্যা করার পুরো উদাহরণটি এটি আমার জন্য ঘরে এনেছে:

জেনেরিক ফাংশন

নীচের মত কিছু ঠিকঠাক কাজ করে:

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;

1
এটির জন্য const fooকি কিছু পূর্বনির্ধারিত জেনেরিক প্রকারের ঘোষণা করা সম্ভব হবে ? অর্থাত type GenericFun<T, A=T> = (payload: A) => T;তারপর করা const foo: GenericFunএখনও একটি প্রদান না করেই জেনেরিক Tধরনের?
— ciekawy

@ সিকাকাভি, আফাইক, এটি না, এবং আমি মনে করি এটি উপলব্ধি করে। জেনারিকস এক অর্থে উচ্চতর অর্ডার প্রকারের অনুমতি দেওয়ার বিষয়ে। অন্যদের মধ্যে এবং অন্যান্য ধরণেরGenericFun<T, A=T> অন্তর্ভুক্ত এমন একটি সেট নির্ধারণ করে। জেনেরিক টাইপগুলি সরাসরি একটি টাইপ টীকাটি তৈরি করার অনুমতি দেয় - উদাহরণস্বরূপ কনস্ট - তবে নির্দিষ্টকরণের প্রয়োজনে যেমন সরবরাহ করা স্থির নিরাপত্তাটি নষ্ট করবে বা যেমন GenericFun<number>GenericFun<string>const foo: GenericFunconst foo: GenericFun<string>const foo: GenericFun<number>
— jbmilgrom

7
আপনার দ্বিতীয় উদাহরণটি কোনও .tsxফাইলের মধ্যে কেবল একটি ত্রুটি (টাইপস্ক্রিপ্ট + জেএসএক্স)। একটি .tsফাইল এটা কাজ করে জরিমানা, যেমন আপনার উপর দেখতে পারেন টাইপ করা বিষয় খেলার মাঠ ।
— danvk

46
আরও নতুন টাইপ const foo = <T,>(x: T) => x;স্ক্রিপ্ট সংকলকগুলি জেএসএক্স দ্বিপাক্ষিকে পাশ কাটাতে পিছনে কমা সমর্থন করে ।
— টমাস

1
@ এডানভক ওয়ার্থ লক্ষণার্থে কেবল এটিই সত্য যারা টিএস ফাইলগুলিতে জেএসএক্সকে নিষিদ্ধ করেছেন - যদি কোনও প্রকল্প টিএস ফাইলগুলিতে জেএসএক্সকে অনুমতি দেওয়ার জন্য কনফিগার করা থাকে তবে আপনার এখনও "এক্সটেন্ডস" বা ট্রেলিং কমা প্রয়োজন হবে
— ম্যাট

64

আমি বিভ্রান্তিকর উপরের উদাহরণটি পেয়েছি। আমি প্রতিক্রিয়া এবং জেএসএক্স ব্যবহার করছি তাই আমার মনে হয় এটি দৃশ্যের জটিল।

আমি টাইপস্ক্রিপ্ট ডিপ ডাইভের কাছ থেকে স্পষ্টতা পেয়েছি , যা তীর জেনেরিকের জন্য উল্লেখ করেছে:

কার্যকারণ: কম্পাইলারটি ইঙ্গিত করার জন্য যে জেনেরিক পরামিতি ব্যবহার করে তা জেনেরিক হয়, এটি একটি সহজ উদাহরণ থেকে আসে যা আমাকে সাহায্য করেছিল।

    const identity = < T extends {} >(arg: T): T => { return arg; }

8
"টি প্রসারিত যে কোনও" এর পরে অকার্যকর সমর্থন করবে।
— মোহাম্মদ ফখরেডাইন

47

আপনি যদি কোনও .tsxফাইলে থাকেন তবে আপনি কেবল লিখতে পারবেন না <T>, তবে এটি কাজ করে:

const foo = <T, >(x: T) => x;

extends {}হ্যাকের বিপরীতে , এই হ্যাকটি অন্তত উদ্দেশ্যটি সংরক্ষণ করে।


তারা কি এই আচরণটি ঠিক করার পরিকল্পনা করে?
— আলেকজান্ডার কিম

আমি অনুমান করি যে এটি সম্পর্কে খুব বেশি কিছু করা যায়নি ... জেএসএক্স এবং টাইপসক্রিপ্ট জেনেরিক সিনটেক্সগুলি কেবল এখানে সংঘর্ষে ..
— এমবি 21

1
কল্পনাপ্রসূত - এটি এখন পর্যন্ত সেরা উত্তর: নিখুঁতভাবে কাজ করে এবং আচরণের কোনও পরিবর্তন করে না!
— জেফ ডেভিড

ডিফল্ট টাইপ পরামিতি টাইপ সম্পর্কে কি? const foo = <T = any,>(x: T) => xকাজ করে না ...
— মিখাইল ভাসিন

34

ভাষার স্পেসিফিকেশন 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})
               });
           };

14

এটি আমার পক্ষে কাজ করে

const Generic = <T> (value: T) => {
    return value;
} 

2
যদি .tsফাইল এই কাজ করে। অন্যথায় এক প্রসারিত করতে হবে।
— কুশলভম

1
পুরোপুরি সূক্ষ্মভাবে কাজ করে: टाइपলিপি- play.js.org/#code/…
— আলিরিজা

এই সূক্ষ্ম vscode মধ্যে .ts এবং .tsx ফাইলের মধ্যে আমার জন্য কাজ করে যাচ্ছে
— Shubhan

3

extends {}কাজের সাথে জনপ্রিয় উত্তর এবং এর চেয়ে ভাল extends any, এটি Tএকটি বস্তু হতে বাধ্য করে

const foo = <T extends {}>(x: T) => x;

এড়াতে এবং ধরণ-সুরক্ষা সংরক্ষণ করতে, আপনি extends unknownপরিবর্তে ব্যবহার করতে পারেন

const foo = <T extends unknown>(x: T) => x;

1

আমি এই ধরণের ঘোষণাটি ব্যবহার করতে চাই:

const identity: { <T>(arg: T): T } = (arg) => arg;

এটি আপনার ফাংশনে অতিরিক্ত প্রপস সংজ্ঞায়িত করার অনুমতি দেয় যদি আপনার কখনও প্রয়োজন হয় এবং কিছু ক্ষেত্রে এটি জেনেরিক সংজ্ঞা থেকে ফাংশন বডি ক্লিনার রাখতে সহায়তা করে।

আপনার যদি অতিরিক্ত প্রপসের প্রয়োজন নেই (নামের জায়গার সাজানোর জিনিস) তবে এটি সরল করে দেওয়া যেতে পারে:

const identity: <T>(arg: T) => T = (arg) => arg;

1

এত দেরীতে, তবে 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 মন্তব্যে বর্ণনা অনুযায়ী
— অ্যাপোলো

একটি পোস্ট দেওয়ার আগে আপনার অন্যান্য সমাধানগুলি পড়া উচিত। আপনার সমাধানটি ইতিমধ্যে ব্যাখ্যা সহ পোস্ট করা হয়েছে। এটি .tsx ফাইল নয়, কেবল একটি .ts ফাইলের অভ্যন্তরে কাজ করে।
— আইজাক পাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.