কিছু অন্যান্য alচ্ছিক পরামিতি বাদ দিলে কীভাবে alচ্ছিক পরামিতিগুলি পাস করবেন?


282

নিম্নলিখিত স্বাক্ষর দেওয়া:

export interface INotificationService {
    error(message: string, title?: string, autoHideAfter?: number);
}

আমি কীভাবে ফাংশনটিকে প্যারামিটারটি নির্দিষ্ট error() না করে বলার জন্য titleসেট autoHideAfterকরতে পারি 1000?

উত্তর:


307

ডকুমেন্টেশনে নির্দিষ্ট হিসাবে , ব্যবহার করুন undefined:

export interface INotificationService {
    error(message: string, title?: string, autoHideAfter? : number);
}

class X {
    error(message: string, title?: string, autoHideAfter?: number) {
        console.log(message, title, autoHideAfter);
    }
}

new X().error("hi there", undefined, 1000);

খেলার মাঠের লিঙ্ক


6
@ বিবিআই 7 আমি মনে করি আপনি ডকুমেন্টেশনটি ভুল বুঝেছেন। ?ফাংশনে যোগ করা হয় সংজ্ঞা , কিন্তু প্রশ্ন আসলে সম্পর্কে কলিং ফাংশন।
থমাস

হাই @ থমাস আমি ডকুমেন্টেশন পুরোপুরি বুঝতে পেরেছি এবং আপনাকে অবশ্যই যুক্ত করতে হবে জানি? ফাংশন সংজ্ঞা পরামিতি পরে। তবে, alচ্ছিক প্যারামিটার (গুলি) দিয়ে কোনও ফাংশন কল করার সাথে সম্পর্কিত আমি প্রযোজ্য না হলে অপরিজ্ঞাত পাস করাকে ধারনা করব। আমি সাধারণত আমি শেষ প্যারামিটার হিসাবে alচ্ছিক প্যারামিটার (গুলি) তৈরি করার উপায়গুলি খুঁজতে চেষ্টা করি যাতে আমি কেবল বনামটি অপরিবর্তিত করতে পারি না। তবে স্পষ্টতই যদি আপনার অনেক থাকে তবে আপনাকে অপরিজ্ঞাত বা অ সত্যবাদী কিছু পাস করতে হবে। আমি নিশ্চিত নই যে আমি মূলত পোস্ট করার সময় আমি কী উল্লেখ করছি। অর্থ এটি সম্পাদিত হয়েছিল কিনা তা আমি জানি না তবে আমি এখন যা দেখছি তা সঠিক।
বিবিআই 7

2
@ বিবিআই 7 কোনও সাম্প্রতিক সম্পাদনা ছিল না। ঠিক আছে, কখনও কি অনুধাবন কর :) (নোট যে আপনি আসলে পাস করতে হবে undefinedযুক্তি সম্পূর্ণভাবে। শুধু "কিছু অ truthy" যাব হিসাবে একই আচরণ পেতে হবে কাজ না, কারণ টাইপ করা বিষয় আসলে তুলনা void 0যা লেখার একটি নিরাপদ উপায় undefined। )
টমাস

71

দুর্ভাগ্যক্রমে টাইপস্ক্রিপ্টে এর মতো কিছুই নেই (আরও বিশদ এখানে: https://github.com/Mic Microsoft/TypeScript/issues/467 )

তবে এটিকে পেতে আপনি আপনার প্যারামগুলিকে একটি ইন্টারফেস হিসাবে পরিবর্তন করতে পারেন:

export interface IErrorParams {
  message: string;
  title?: string;
  autoHideAfter?: number;
}

export interface INotificationService {
  error(params: IErrorParams);
}

//then to call it:
error({message: 'msg', autoHideAfter: 42});

আপনি কি দয়া করে বলতে পারেন, আমি কি ত্রুটি পদ্ধতিটিকে এটিকে ভুল হিসাবে বলতে পারি, ত্রুটি (test বার্তা: 'পরীক্ষা'}), আমি মনে করি, আমরা ত্রুটি করতে পারি না ({বার্তা: 'পরীক্ষা', অটোহাইডাএফটার: অপরিবর্তিত}), কিন্তু আমি যা প্রত্যাশা করছি তা হ'ল ত্রুটি (বার্তা), যদি আমি অন্য প্যারামারগুলি পাস না করি তবে এটি ডিফল্ট পরামিতিগুলির মান গ্রহণ করতে পারে।
সেগোন

37

আপনি optionচ্ছিক ভেরিয়েবলটি ব্যবহার করতে পারেন ?বা যদি আপনার একাধিক alচ্ছিক ভেরিয়েবল দ্বারা ...উদাহরণস্বরূপ:

function details(name: string, country="CA", address?: string, ...hobbies: string) {
    // ...
}

উপরে:

  • name দরকার
  • country প্রয়োজনীয় এবং এটির একটি ডিফল্ট মান রয়েছে
  • address alচ্ছিক
  • hobbies optionচ্ছিক প্যারামগুলির একটি অ্যারে

2
শখগুলি অ্যারে হিসাবে টাইপ করা উচিত নয়?
প্রোগ্রামারপার

4
এই উত্তরে একটি দরকারী তথ্য রয়েছে, তবে এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি হ'ল আমি এটি দেখতে পাচ্ছি, কীভাবে কোনও ব্যক্তি বেশ কয়েকটি alচ্ছিক প্যারামিটারগুলি বাইপাস / এড়িয়ে যেতে পারে এবং কেবলমাত্র নির্দিষ্ট নির্দিষ্ট করে সেট করতে পারে।
ম্যাক্সবি

2
দেশের প্রয়োজন হয় না, এটি অপশনহীন পরিবর্তে 'সিএ' এর ডিফল্ট মান সম্পন্ন একটি alচ্ছিক প্যারাম। যদি এটির প্রয়োজন হয় তবে ডিফল্ট মান সরবরাহ করার বিষয়টি কী?
আনন্দ ভূষণ

19

আরেকটি পদ্ধতি হ'ল:

error(message: string, options?: {title?: string, autoHideAfter?: number});

সুতরাং যখন আপনি শিরোনামের প্যারামিটারটি বাদ দিতে চান, ঠিক তেমন ডেটা প্রেরণ করুন:

error('the message', { autoHideAfter: 1 })

আমি বরং এই বিকল্পগুলি চাই কারণ অন্যকে না পাঠিয়েই আমাকে আরও পরামিতি যুক্ত করতে দেয়।


আপনি কিভাবে একটি ডিফল্ট মান পাস করতে হবে title?
ড্যান ড্যাসকলেসকু

13

এটি @ ব্রোকোর জবাবের প্রায় একই, তবে সামান্য মোচড় দিয়ে: কেবল কোনও বস্তুতে optionচ্ছিক পরামিতিগুলি পাস করুন। (এবং প্যারাম অবজেক্টকে alচ্ছিকও তৈরি করুন)।

এটি পাইথনের ** কাওয়ার্গের মতো ধরণের হয়ে গেছে তবে ঠিক তা নয় exactly

export interface IErrorParams {
  title?: string;
  autoHideAfter?: number;
}

export interface INotificationService {
  // make params optional so you don't have to pass in an empty object
  // in the case that you don't want any extra params
  error(message: string, params?: IErrorParams);
}

// all of these will work as expected
error('A message with some params but not others:', {autoHideAfter: 42});
error('Another message with some params but not others:', {title: 'StackOverflow'});
error('A message with all params:', {title: 'StackOverflow', autoHideAfter: 42});
error('A message with all params, in a different order:', {autoHideAfter: 42, title: 'StackOverflow'});
error('A message with no params at all:');

5

আপনি ইন্টারফেসে একাধিক পদ্ধতি স্বাক্ষর নির্দিষ্ট করতে পারেন তারপরে শ্রেণিক পদ্ধতিতে একাধিক পদ্ধতি ওভারলোড রয়েছে:

interface INotificationService {
    error(message: string, title?: string, autoHideAfter?: number);
    error(message: string, autoHideAfter: number);
}

class MyNotificationService implements INotificationService {
    error(message: string, title?: string, autoHideAfter?: number);
    error(message: string, autoHideAfter?: number);
    error(message: string, param1?: (string|number), param2?: number) {
        var autoHideAfter: number,
            title: string;

        // example of mapping the parameters
        if (param2 != null) {
            autoHideAfter = param2;
            title = <string> param1;
        }
        else if (param1 != null) {
            if (typeof param1 === "string") {
                title = param1;
            }
            else {
                autoHideAfter = param1;
            }
        }

        // use message, autoHideAfter, and title here
    }
}

এখন এই সমস্ত কাজ করবে:

var service: INotificationService = new MyNotificationService();
service.error("My message");
service.error("My message", 1000);
service.error("My message", "My title");
service.error("My message", "My title", 1000);

... এবং errorপদ্ধতিতে INotificationServiceনিম্নলিখিত বিকল্পগুলি থাকবে:

ওভারলোড ইন্টেলিজেন্স

খেলার মাঠ


9
কেবলমাত্র একটি নোট যা আমি এর বিপরীতে সুপারিশ করব এবং পরিবর্তে কোনও বস্তুতে পাস করব এবং এই পরামিতিগুলিকে সেই বস্তুর বৈশিষ্ট্য হিসাবে রাখব ... এটি অনেক কম কাজ এবং কোডটি আরও পঠনযোগ্য হবে।
ডেভিড শেরেট

2

আপনি একটি সহায়ক পদ্ধতি তৈরি করতে পারেন যা ত্রুটির যুক্তিগুলির ভিত্তিতে একটি অবজেক্ট প্যারামিটার বেস গ্রহণ করে

 error(message: string, title?: string, autoHideAfter?: number){}

 getError(args: { message: string, title?: string, autoHideAfter?: number }) {
    return error(args.message, args.title, args.autoHideAfter);
 }

-1

আপনি শূন্য শিরোনাম সেট করতে চেষ্টা করতে পারেন।

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

error('This is the ',null,1000)

3
এই woulndt কাজ থেকে যদি ফাংশন প্যারামিটার ডিফল্ট মান যখন আপনি যে ফাংশন পরামিতির নাল পাঠিয়েছেন এটি সেট করা হবে না ডিফল্ট মান
Okan থেকে SARICA

-2

আপনি কোনও ইন্টারফেস ছাড়াই এটি করতে পারেন।

class myClass{
  public error(message: string, title?: string, autoHideAfter? : number){
    //....
  }
}

?operatorচ্ছিক প্যারামিটার হিসাবে অপারেটরটি ব্যবহার করুন ।


তবে এটি আপনাকে messageautoHideAfter
কোনওভাবেও

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