টাইপস্ক্রিপ্ট কলব্যাক প্রকারের সংজ্ঞা দেওয়া হচ্ছে


172

আমি টাইপস্ক্রিপ্টে নিম্নলিখিত ক্লাস পেয়েছি:

class CallbackTest
{
    public myCallback;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

আমি ক্লাসটি এভাবে ব্যবহার করছি:

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

কোডটি কাজ করে, সুতরাং এটি প্রত্যাশার মতো একটি বার্তাবক্স প্রদর্শন করে।

আমার প্রশ্নটি: আমার ক্লাস ফিল্ডের জন্য আমি কি কোনও ধরণের সরবরাহ করতে পারি myCallback? এই মুহূর্তে, উপরে প্রদর্শিত হিসাবে পাবলিক ফিল্ড myCallbackটাইপ করা anyহয়। আমি কীভাবে কলব্যাকের পদ্ধতি স্বাক্ষরটি সংজ্ঞায়িত করতে পারি? বা আমি কি কেবল টাইপটিকে কোনও ধরণের কলব্যাক-টাইপ করতে পারি? বা আমি এই আরও কিছু করতে পারি? আমার কি ব্যবহার করতে হবে any(অন্তর্নিহিত / সুস্পষ্ট)?

আমি এই জাতীয় কিছু চেষ্টা করেছি, তবে এটি কার্যকর হয়নি (সংকলন-সময় ত্রুটি):

public myCallback: ();
// or:
public myCallback: function;

আমি অনলাইনে এই বিষয়ে কোনও ব্যাখ্যা খুঁজে পাইনি, তাই আমি আশা করি আপনি আমাকে সহায়তা করতে পারেন।

উত্তর:


211

আমি টাইপস্ক্রিপ্ট ভাষার স্পেসিফিকেশনে কিছু খুঁজে পেয়েছি, এটি মোটামুটি সহজ। আমি বেশ কাছাকাছি ছিলাম।

বাক্য গঠনটি নিম্নলিখিত:

public myCallback: (name: type) => returntype;

আমার উদাহরণে, এটি হবে

class CallbackTest
{
    public myCallback: () => void;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

8
কলব্যাক স্বাক্ষর সংজ্ঞায়িত করার জন্য প্যারামিটারের নাম কেন প্রয়োজন তা আমি পাই না ...
2grit

4
আমার ধারণা এটি সি # টিমের কিছু সাংস্কৃতিক heritage
তিহ্য

@ নাইকী আপনি কি ডকুমেন্টেশনের সেই পৃষ্ঠাটিতে একটি লিঙ্ক সরবরাহ করতে পারেন?
jcairney

এটি একটি ভাল লিঙ্ক হতে পারে fettblog.eu/typescript-substitutability
নীলকণ্ঠ সিংহ দেও

147

আরও এক ধাপ এগিয়ে যাওয়ার জন্য, আপনি কোনও ফাংশন স্বাক্ষরের জন্য টাইপ পয়েন্টার ঘোষণা করতে পারেন:

interface myCallbackType { (myArgument: string): void }

এবং এটি এর মতো ব্যবহার করুন:

public myCallback : myCallbackType;

9
এটি (আইএমও) গ্রহণযোগ্য উত্তরের চেয়ে আরও ভাল সমাধান, কারণ এটি আপনাকে কোনও প্রকারের সংজ্ঞা দেয় এবং তারপরে বলে, সেই ধরণের একটি পরামিতি (কলব্যাক) পাস করতে পারে যা আপনি কল করার সাথে সাথে যে কোনও উপায় ব্যবহার করতে পারেন। গৃহীত উত্তরটি সদস্য ভেরিয়েবল ব্যবহার করে এবং আপনাকে সদস্যটিকে আপনার ফাংশনে সেট করতে হবে, তারপরে একটি পদ্ধতি কল করুন - কুরুচিপূর্ণ এবং ত্রুটির প্রবণতা, কারণ প্রথমে ভেরিয়েবল সেট করা পদ্ধতিটি কল করার চুক্তির অংশ।
ডেভিড

এটি আপনাকে সহজেই let callback: myCallbackType|null = null;
কলব্যাককে শনাক্তযোগ্য

1
দ্রষ্টব্য যে টিএসলিন্ট "টিএসলিন্ট: ইন্টারফেসের কেবলমাত্র একটি কল স্বাক্ষর রয়েছে - type MyHandler = (myArgument: string) => voidপরিবর্তে ব্যবহার করুন ((কলযোগ্য-প্রকার)" ; দেখতে TSV এর উত্তর
Arjan

এই উত্তরের পূর্ববর্তী খসড়াটি আসলে সেই সমস্যার সমাধান করেছিল যা আমাকে এই প্রশ্নের দিকে নিয়ে গিয়েছিল। আমি একটি ইন্টারফেসের মধ্যে এমন অনুমতিযুক্ত পর্যাপ্ত ফাংশন স্বাক্ষর সংজ্ঞায়নের চেষ্টা করছিলাম যা সংকলক ত্রুটি তৈরি না করে যে কোনও সংখ্যক পরামিতি গ্রহণ করতে পারে। আমার ক্ষেত্রে উত্তরটি ব্যবহার করা ছিল ...args: any[]। উদাহরণ: রফতানি ইন্টারফেস MyInterface {/ ** একটি কলব্যাক ফাংশন। / কলব্যাক: (... আরগস: যে কোনও []) => যে কোনও, / * কলব্যাক ফাংশনের জন্য পরামিতি। * / কলব্যাকপ্রেমস: যে কোনও []}
কেন লিয়ন

61

আপনি একটি নতুন ধরণের ঘোষণা করতে পারেন:

declare type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

হালনাগাদ.

declareশব্দ প্রয়োজন নেই। এটি .d.ts ফাইলগুলিতে বা অনুরূপ ক্ষেত্রে ব্যবহার করা উচিত।


আমি এর জন্য ডকুমেন্টেশন কোথায় পাই?
ই সুন্দিন

@ E.Sundin - বিভাগের "প্রকার ওরফে" typescriptlang.org/docs/handbook/advanced-types.html
TSV

1
সত্য এবং জেনে রাখা ভাল, একই পৃষ্ঠাতে (আজকাল) আরও জানিয়েছে "যেহেতু সফ্টওয়্যারটির একটি আদর্শ সম্পত্তি এক্সটেনশনের জন্য উন্মুক্ত হচ্ছে, আপনার যদি সম্ভব হয় তবে সর্বদা একটি টাইপ ওরফে একটি ইন্টারফেস ব্যবহার করা উচিত।"
আরজান

@ আরজান - বস্তুর জন্য আমি এর সাথে পুরোপুরি একমত। আপনি দয়া করে নির্দিষ্ট করতে পারেন - আপনি কিভাবে একটি ফাংশন প্রসারিত করতে চান?
টিএসভি

নোট করুন যে প্রকারের ঘোষণাটি var handler: (myArgument: string) => voidalচ্ছিক : সিনট্যাক্টিক্যালি বৈধ (যদি কিছুটা অগোছালো থাকে)।
হুচ

35

এখানে একটি উদাহরণ রয়েছে - কোনও পরামিতি গ্রহণ করা এবং কিছুই ফিরিয়ে দেওয়া।

class CallbackTest
{
    public myCallback: {(): void;};

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

আপনি যদি কোনও প্যারামিটার গ্রহণ করতে চান তবে আপনি এটি যুক্ত করতে পারেন:

public myCallback: {(msg: string): void;};

এবং যদি আপনি কোনও মান ফিরিয়ে দিতে চান তবে আপনি এটি যুক্ত করতে পারেন:

public myCallback: {(msg: string): number;};

কার্যত তারা অভিন্ন - তারা একই জিনিস সংজ্ঞা দেয় এবং ফাংশন স্বাক্ষর আপনি পরীক্ষা টাইপ দেয়। আপনি যাকে পছন্দ করুন ব্যবহার করতে পারেন। অনুমান তারা বলে exactly equivalent
ফেন্টন

6
@ নাইকী: প্রশ্নটি বরং আপনার উত্তরের সাথে আলাদা কী? স্টিভ তার উত্তর আপনার আগে পোস্ট করেছেন।
jgauffin

@ জাগাফিন আসলে ফলাফলও একই রকম। কলব্যাকের বিষয়ে কথা বলার সময় আইএমও আমি যে সমাধানটি পোস্ট করেছি তা স্বাভাবিক, এটি আপনার পছন্দ উপর নির্ভর করে।
নাইকি

@ ফেন্টন আপনি কি এই ডকুমেন্টেশনের লিঙ্ক সরবরাহ করতে পারেন?
jcairney

17

আপনি যদি জেনেরিক ফাংশন চান তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন। যদিও এটি কোথাও নথিভুক্ত বলে মনে হচ্ছে না।

class CallbackTest {
  myCallback: Function;
}   

3

আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

  1. উপন্যাসটি টাইপ করুন ( typeকীওয়ার্ড ব্যবহার করে , একটি ফাংশন আক্ষরিক aliasing)
  2. ইন্টারফেস
  3. ফাংশন লিটারাল

সেগুলি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

type myCallbackType = (arg1: string, arg2: boolean) => number;

interface myCallbackInterface { (arg1: string, arg2: boolean): number };

class CallbackTest
{
    // ...

    public myCallback2: myCallbackType;
    public myCallback3: myCallbackInterface;
    public myCallback1: (arg1: string, arg2: boolean) => number;

    // ...

}

1

ইভেন্ট শ্রোতার কাছে কলব্যাক যোগ করার চেষ্টা করার সময় আমি একই ত্রুটিটি দেখতে পেয়েছি। আশ্চর্যের সাথে, কলব্যাক টাইপ সেট করে ইভেন্টএলস্টনার এটি সমাধান করে। এটি পুরো ফাংশনের স্বাক্ষরটিকে কোনও ধরণের হিসাবে সংজ্ঞায়িত করার চেয়ে আরও মার্জিত দেখায় তবে আমি নিশ্চিত নই যে এটি করার এটি সঠিক উপায় কিনা।

class driving {
    // the answer from this post - this works
    // private callback: () => void; 

    // this also works!
    private callback:EventListener;

    constructor(){
        this.callback = () => this.startJump();
        window.addEventListener("keydown", this.callback);
    }

    startJump():void {
        console.log("jump!");
        window.removeEventListener("keydown", this.callback);
    }
}

পছন্দ করি. কিন্তু অন্য শ্রেণির কর্ম কোথায়?
ইয়ারো

1

আমি কিছুটা দেরি করে এসেছি, তবে কিছুকাল আগে থেকে টাইপস্ক্রিপ্টে আপনি কলব্যাকের ধরণটি সংজ্ঞায়িত করতে পারেন

type MyCallback = (KeyboardEvent) => void;

ব্যবহারের উদাহরণ:

this.addEvent(document, "keydown", (e) => {
    if (e.keyCode === 1) {
      e.preventDefault();
    }
});

addEvent(element, eventName, callback: MyCallback) {
    element.addEventListener(eventName, callback, false);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.