বর্তমানে আমার টাইপ সংজ্ঞা রয়েছে:
interface Param {
title: string;
callback: any;
}
আমার মতো কিছু দরকার:
interface Param {
title: string;
callback: function;
}
তবে দ্বিতীয়টি গ্রহণ করা হচ্ছে না।
বর্তমানে আমার টাইপ সংজ্ঞা রয়েছে:
interface Param {
title: string;
callback: any;
}
আমার মতো কিছু দরকার:
interface Param {
title: string;
callback: function;
}
তবে দ্বিতীয়টি গ্রহণ করা হচ্ছে না।
উত্তর:
গ্লোবাল টাইপ Functionএই উদ্দেশ্যে কাজ করে।
অতিরিক্ত হিসাবে, আপনি যদি 0 টি আর্গুমেন্টের সাথে এই কলব্যাকটি চালিত করতে চান এবং এর রিটার্ন মানটিকে উপেক্ষা করবেন, টাইপটি () => voidকোনও আর্গুমেন্ট না নিয়ে সমস্ত ফাংশনের সাথে মেলে।
Functionকথা বলছেন এবং দ্বিতীয় অনুচ্ছেদে ( () => voidব্যবহারের ক্ষেত্রে বা তার সাথে মিলিত ধরনের ) ব্যবহার করা পছন্দ করছেন?
ভি 1.4 এর টাইপস্ক্রিপ্টে typeকীওয়ার্ড রয়েছে যা টাইপ ওরফে ঘোষিত করে ( typedefসি / সি ++ এর ক্ষেত্রে সমান )। আপনি আপনার কলব্যাক প্রকারটি এভাবে ঘোষণা করতে পারেন:
type CallbackFunction = () => void;
যা এমন একটি ফাংশন ঘোষণা করে যা কোনও যুক্তি গ্রহণ করে না এবং কিছুই ফিরিয়ে দেয়। এমন একটি ফাংশন যা কোনও ধরণের শূন্য বা আরও বেশি আর্গুমেন্ট নেয় এবং কিছুই ফিরিয়ে দেয় না:
type CallbackFunctionVariadic = (...args: any[]) => void;
তারপরে আপনি বলতে পারেন, উদাহরণস্বরূপ,
let callback: CallbackFunctionVariadic = function(...args: any[]) {
// do some stuff
};
আপনি যদি এমন কোনও ফাংশন চান যা একটি নির্বিচার সংখ্যক আর্গুমেন্ট গ্রহণ করে এবং কোনও কিছু ফেরত দেয় (শূন্য সহ):
type CallbackFunctionVariadicAnyReturn = (...args: any[]) => any;
আপনি কিছু বাধ্যতামূলক আর্গুমেন্ট এবং তারপরে অতিরিক্ত আর্গুমেন্টের একটি সেট (একটি স্ট্রিং, একটি সংখ্যা এবং তারপরে অতিরিক্ত আরগের একটি সেট বলতে পারেন) এভাবে নির্দিষ্ট করতে পারেন:
type CallbackFunctionSomeVariadic =
(arg1: string, arg2: number, ...args: any[]) => void;
ইভেন্ট ইভেন্টমিটার হ্যান্ডলারগুলির মতো জিনিসগুলির জন্য এটি দরকারী হতে পারে।
এই ফ্যাশনে আপনার পছন্দ মতো ফাংশনগুলি টাইপ করা যেতে পারে, যদিও আপনি টাইপ ওরফে দিয়ে সমস্ত কিছু পেরেক করার চেষ্টা করলে আপনি দূরে সরে যেতে পারেন এবং মিশ্রিত সমস্যায় পড়তে পারেন।
Functionএবং (...args: any[]) => anyকি পছন্দ করা হয়?
...args: any[]খুব দরকারী নয়।
type CallbackFunctionSomeVariadic = (arg1: string, arg2: number, ...args: any[]) => void;আমি যা খুঁজছিলাম, টাই।
এখানে একটি ফাংশনের একটি উদাহরণ যা কলব্যাক গ্রহণ করে
const sqk = (x: number, callback: ((_: number) => number)): number => {
// callback will receive a number and expected to return a number
return callback (x * x);
}
// here our callback will receive a number
sqk(5, function(x) {
console.log(x); // 25
return x; // we must return a number here
});
যদি আপনি কলব্যাকের রিটার্ন মানগুলির বিষয়ে চিন্তা না করেন (বেশিরভাগ লোকেরা কোনও কার্যকর উপায়ে কীভাবে এটি ব্যবহার করতে হয় তা জানেন না), আপনি ব্যবহার করতে পারেন void
const sqk = (x: number, callback: ((_: number) => void)): void => {
// callback will receive a number, we don't care what it returns
callback (x * x);
}
// here our callback will receive a number
sqk(5, function(x) {
console.log(x); // 25
// void
});
দ্রষ্টব্য, আমি callbackপ্যারামিটারের জন্য স্বাক্ষরটি ব্যবহার করেছি ...
const sqk = (x: number, callback: ((_: number) => number)): number
আমি বলব এটি একটি টাইপস্ক্রিপ্টের ঘাটতি কারণ আমরা কলব্যাক পরামিতিগুলির জন্য একটি নাম সরবরাহ করবে বলে আশা করা হচ্ছে । এই ক্ষেত্রে আমি ব্যবহার করেছি _কারণ এটি sqkফাংশনের অভ্যন্তরে ব্যবহারযোগ্য নয় ।
তবে, আপনি যদি এটি করেন
// danger!! don't do this
const sqk = (x: number, callback: ((number) => number)): number
এটি বৈধ টাইপস্ক্রিপ্ট, তবে এটি ব্যাখ্যা করা হবে ...
// watch out! typescript will think it means ...
const sqk = (x: number, callback: ((number: any) => number)): number
অর্থাত, টাইপ করা বিষয় মনে করবে প্যারামিটার নাম হয় numberএবং উহ্য ধরনের any। এটি স্পষ্টতই আমরা যা ইচ্ছা করি তা নয়, হায় হায়, টাইপস্ক্রিপ্ট কীভাবে এটি কাজ করে।
সুতরাং আপনার ফাংশন প্যারামিটারগুলি টাইপ করার সময় প্যারামিটারের নামগুলি সরবরাহ করতে ভুলবেন না ... বোধহয় বোকা।
আপনি বিভিন্ন উপায়ে ইন্টারফেসে একটি ফাংশন ধরণের সংজ্ঞা দিতে পারেন,
export interface IParam {
title: string;
callback(arg1: number, arg2: number): number;
}
export interface IParam {
title: string;
callback: (arg1: number, arg2: number) => number;
}
type MyFnType = (arg1: number, arg2: number) => number;
export interface IParam {
title: string;
callback: MyFnType;
}
ব্যবহার করা খুব সোজা এগিয়ে,
function callingFn(paramInfo: IParam):number {
let needToCall = true;
let result = 0;
if(needToCall){
result = paramInfo.callback(1,2);
}
return result;
}
export interface IParam{
title: string;
callback(lateCallFn?:
(arg1:number,arg2:number)=>number):number;
}
চারটি বিমূর্ত ফাংশন প্রকার রয়েছে, আপনি যখন জানেন যে আপনার ফাংশনটি একটি যুক্তি (গুলি) নেবে বা না নেবে, কোনও ডেটা ফেরত দেবে বা না করবে তখন আপনি সেগুলি আলাদাভাবে ব্যবহার করতে পারেন।
export declare type fEmptyVoid = () => void;
export declare type fEmptyReturn = () => any;
export declare type fArgVoid = (...args: any[]) => void;
export declare type fArgReturn = (...args: any[]) => any;
এটার মত:
public isValid: fEmptyReturn = (): boolean => true;
public setStatus: fArgVoid = (status: boolean): void => this.status = status;
কোনও ফাংশন প্রকার হিসাবে কেবলমাত্র এক প্রকারের জন্য আমরা সমস্ত বিমূর্ত প্রকারগুলি একত্রিত করতে পারি, এর মতো:
export declare type fFunction = fEmptyVoid | fEmptyReturn | fArgVoid | fArgReturn;
তারপরে এটি ব্যবহার করুন:
public isValid: fFunction = (): boolean => true;
public setStatus: fFunction = (status: boolean): void => this.status = status;
উপরের উদাহরণে সবকিছু সঠিক। তবে বেশিরভাগ কোড সম্পাদকের দৃষ্টিকোণ থেকে বেলোতে ব্যবহারের উদাহরণটি সঠিক নয়।
// you can call this function with any type of function as argument
public callArgument(callback: fFunction) {
// but you will get editor error if call callback argument like this
callback();
}
সম্পাদকদের জন্য সঠিক কলটি এরকম:
public callArgument(callback: fFunction) {
// pay attention in this part, for fix editor(s) error
(callback as fFunction)();
}
প্রকারভেদ: পদ্ধতি প্যারামিটারে ব্যবহৃত কোনও ফাংশন কলব্যাকের জন্য প্রকারটি কীভাবে সংজ্ঞায়িত করবেন ?
আপনি কলব্যাকটি 1) ফাংশন সম্পত্তি বা 2) পদ্ধতি হিসাবে ঘোষণা করতে পারেন :
interface ParamFnProp {
callback: (a: Animal) => void; // function property
}
interface ParamMethod {
callback(a: Animal): void; // method
}
টিএস 2.6 এর পরে টাইপ করার একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে :
কোনও ফাংশন সম্পত্তি ঘোষিত হওয়ার পরে আপনি শক্তিশালী ("শব্দ") প্রকারগুলি --strictবা --strictFunctionTypesমোডে পান । একটি উদাহরণ নেওয়া যাক:
const animalCallback = (a: Animal): void => { } // Animal is the base type for Dog
const dogCallback = (d: Dog): void => { }
// function property variant
const param11: ParamFnProp = { callback: dogCallback } // error: not assignable
const param12: ParamFnProp = { callback: animalCallback } // works
// method variant
const param2: ParamMethod = { callback: dogCallback } // now it works again ...
টেকনিক্যালি উচ্চারিত, পদ্ধতি bivariant এবং ফাংশন বৈশিষ্ট্য contravariant অধীন আর্গুমেন্ট strictFunctionTypes। বিল্ট-ইন ধরণের সংমিশ্রণে কিছুটা আরও ব্যবহারিক হতে পন্থাগুলি এখনও আরও অনুমতভাবে পরীক্ষা করা হয় (শব্দ না হলেও) Array।