টাইপসক্রিপ্ট: পদ্ধতি প্যারামিটারে ব্যবহৃত কোনও ফাংশন কলব্যাকের জন্য টাইপ কীভাবে সংজ্ঞায়িত করতে হবে (কোনও ফাংশনের ধরণ হিসাবে, সর্বজনীন নয়)


313

বর্তমানে আমার টাইপ সংজ্ঞা রয়েছে:

interface Param {
    title: string;
    callback: any;
}

আমার মতো কিছু দরকার:

interface Param {
    title: string;
    callback: function;
}

তবে দ্বিতীয়টি গ্রহণ করা হচ্ছে না।

উত্তর:


285

গ্লোবাল টাইপ Functionএই উদ্দেশ্যে কাজ করে।

অতিরিক্ত হিসাবে, আপনি যদি 0 টি আর্গুমেন্টের সাথে এই কলব্যাকটি চালিত করতে চান এবং এর রিটার্ন মানটিকে উপেক্ষা করবেন, টাইপটি () => voidকোনও আর্গুমেন্ট না নিয়ে সমস্ত ফাংশনের সাথে মেলে।


27
এই জিনিসটি প্রাথমিক
ধরণে

13
এটি একটি মৌলিক ধরণের নয় কারণ আপনার যুক্তি এবং ফেরতের মানগুলি সংজ্ঞায়িত করা উচিত। কলব্যাকের মতো কিছু: (সংখ্যা: সংখ্যা) => শূন্য; কলব্যাকের চেয়ে টাইপ চেকিংয়ের জন্য অনেক বেশি কার্যকর: ফাংশন; হবে.
কেপআপ

@ কেপআপ স্পষ্টরূপে, আপনি কি এই উত্তরের প্রথম লাইনে প্রদর্শিত ক্যাপিটাল এফ ব্যবহার না করার Functionকথা বলছেন এবং দ্বিতীয় অনুচ্ছেদে ( () => voidব্যবহারের ক্ষেত্রে বা তার সাথে মিলিত ধরনের ) ব্যবহার করা পছন্দ করছেন?
রাফিন

2
এফডাব্লুআইডাব্লু, ফাংশন প্রকারের
ডকগুলি

191

ভি 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;

ইভেন্ট ইভেন্টমিটার হ্যান্ডলারগুলির মতো জিনিসগুলির জন্য এটি দরকারী হতে পারে।

এই ফ্যাশনে আপনার পছন্দ মতো ফাংশনগুলি টাইপ করা যেতে পারে, যদিও আপনি টাইপ ওরফে দিয়ে সমস্ত কিছু পেরেক করার চেষ্টা করলে আপনি দূরে সরে যেতে পারেন এবং মিশ্রিত সমস্যায় পড়তে পারেন।


1
এর মধ্যে Functionএবং (...args: any[]) => anyকি পছন্দ করা হয়?
অহং

@ ইয়ং: ব্যক্তিগতভাবে আমি পরেটিকে পছন্দ করব কারণ এটি একটি স্বাক্ষর সরবরাহ করে ... সাধারণত। ...args: any[]খুব দরকারী নয়।
এড এস

type CallbackFunctionSomeVariadic = (arg1: string, arg2: number, ...args: any[]) => void;আমি যা খুঁজছিলাম, টাই।
akteifan

স্বীকৃত হিসাবে চিহ্নিত করা উচিত
ভাদোরাকোস্ট

61

রায়ের উত্তর অনুসরণ করে, আমি মনে করি যে আপনি যে ইন্টারফেসটির সন্ধান করছেন তা নীচে সংজ্ঞায়িত হয়েছে:

interface Param {
    title: string;
    callback: () => void;
}

34

এখানে একটি ফাংশনের একটি উদাহরণ যা কলব্যাক গ্রহণ করে

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। এটি স্পষ্টতই আমরা যা ইচ্ছা করি তা নয়, হায় হায়, টাইপস্ক্রিপ্ট কীভাবে এটি কাজ করে।

সুতরাং আপনার ফাংশন প্যারামিটারগুলি টাইপ করার সময় প্যারামিটারের নামগুলি সরবরাহ করতে ভুলবেন না ... বোধহয় বোকা।


32

আপনি বিভিন্ন উপায়ে ইন্টারফেসে একটি ফাংশন ধরণের সংজ্ঞা দিতে পারেন,

  1. সাধারণ উপায়:
export interface IParam {
  title: string;
  callback(arg1: number, arg2: number): number;
}
  1. আপনি যদি সম্পত্তি সংশ্লেষটি ব্যবহার করতে চান তবে,
export interface IParam {
  title: string;
  callback: (arg1: number, arg2: number) => number;
}
  1. আপনি যদি প্রথমে ফাংশন প্রকারের ঘোষণা করেন,
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;
}
  1. আপনি কোনও ফাংশন টাইপের আক্ষরিকও ঘোষণা করতে পারেন, যার অর্থ কোনও ফাংশন তার প্যারামিটার হিসাবে অন্য ফাংশন গ্রহণ করতে পারে। প্যারামিটারাইজ ফাংশনকে কলব্যাকও বলা যেতে পারে।
export interface IParam{
  title: string;
  callback(lateCallFn?:
             (arg1:number,arg2:number)=>number):number;

}

10

চারটি বিমূর্ত ফাংশন প্রকার রয়েছে, আপনি যখন জানেন যে আপনার ফাংশনটি একটি যুক্তি (গুলি) নেবে বা না নেবে, কোনও ডেটা ফেরত দেবে বা না করবে তখন আপনি সেগুলি আলাদাভাবে ব্যবহার করতে পারেন।

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)();
}

2

প্রকারভেদ: পদ্ধতি প্যারামিটারে ব্যবহৃত কোনও ফাংশন কলব্যাকের জন্য প্রকারটি কীভাবে সংজ্ঞায়িত করবেন ?

আপনি কলব্যাকটি 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

সারসংক্ষেপ

  • ফাংশন সম্পত্তি এবং পদ্ধতি ঘোষণার মধ্যে এক ধরণের পার্থক্য রয়েছে
  • যদি সম্ভব হয় তবে শক্তিশালী প্রকারের জন্য একটি ফাংশন সম্পত্তি চয়ন করুন

খেলার মাঠের নমুনা কোড

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.