টাইপস্ক্রিপ্ট অবজেক্টের জন্য ডিফল্ট মান নির্ধারণ করা হচ্ছে আর্গুমেন্ট হিসাবে


195
function sayName(params: {firstName: string; lastName?: string}) {
    params.lastName = params.lastName || 'smith';  // <<-- any better alternative to this?
    var name = params.firstName + params.lastName
    alert(name);
}

sayName({firstName: 'bob'});

আমি কল্পনা করেছিলাম এমন কিছু কাজ করতে পারে:

function sayName(params: {firstName: string; lastName: string = 'smith'}) {

স্পষ্টতই যদি এগুলি সরল যুক্তি হয়ে থাকে তবে আপনি এটিটি করতে পারতেন:

function sayName(firstName: string, lastName = 'smith') {
    var name = firstName + lastName;
    alert(name);
}

sayName('bob');

এবং কফিস্ক্রিপ্টে আপনার শর্তসাপেক্ষ অস্তিত্ব অপারেটরের অ্যাক্সেস রয়েছে তাই করতে পারেন:

param.lastName ?= 'smith'

যা জাভাস্ক্রিপ্ট সংকলন:

if (param.lastName == null) {
    param.lastName = 'smith';
}

আপনার প্রস্তাবিত সমাধানটি params.lastName = params.lastName || 'smith';আসলে বরং দুর্দান্ত - এটি খালি স্ট্রিং, অপরিজ্ঞাত স্ট্রিং এবং নাল মানগুলি পরিচালনা করে।
— ফেন্টন

পুনঃটুইট একটি পদবি ক্ষেত্রে এটি ঠিক আছে, তবে সাধারণত ভাল ধারণা হয় না। এজন্য টাইপস্ক্রিপ্ট ডিফল্ট মানগুলিতে অনুবাদ করে if(typeof x === "undefined") { … }। আপনি এটি জানেন না এমন নয়, তবে কেবল ওপির জন্য সাধারণ কেসটি নির্দেশ করছেন।
— ইনগো বার্ক

1
@ ইনগোবার্ক সত্য, তবে lastName?: stringস্টিভফেন্টন বলেছিলেন যে "খালি স্ট্রিং, অপরিজ্ঞাত স্ট্রিং এবং নাল মানগুলি পরিচালনা করে" এর কারণেই এটি কেবল কখনও হতে পারে।
— এজেপি

টাইপস্ক্রিপ্টের মধ্যে @ এজেপি, হ্যাঁ। তবে এটি কেবল সংকলন-সময়। যে কোনও উপায়ে, যেমন আমি বলেছিলাম, কেবল একটি সাধারণ কেস দৃশ্যের দিকে লক্ষ্য
— রেখেছি

2
স্টিভের সাথে এখানে সম্মত হন। বেশিরভাগ ক্ষেত্রে উদাহরণস্বরূপ 10 টি আর্গুমেন্টের পরিবর্তে একক কনফিগার আর্গুমেন্ট রাখা ভাল। এই ক্ষেত্রে params.lastName = params.lastName || 'smith';প্যাটার্ন আমি ব্যবহার
— basarat

উত্তর:


210

আসলে, এখন একটি সহজ উপায় বলে মনে হচ্ছে। নিম্নলিখিত কোড টাইপস্ক্রিপ্ট 1.5 তে কাজ করে:

function sayName({ first, last = 'Smith' }: {first: string; last?: string }): void {
  const name = first + ' ' + last;
  console.log(name);
}

sayName({ first: 'Bob' });

কৌতুকটি হ'ল প্রথমে key=valueকোনও ডিফল্ট জন্য যুক্তিযুক্ত বস্তু থেকে কী কী বাছাই করতে চান তা বন্ধনীতে রেখে দেওয়া । এটি :এবং একটি প্রকারের ঘোষণার সাথে অনুসরণ করুন ।

এটি আপনি যা করার চেষ্টা করেছিলেন তার থেকে কিছুটা আলাদা, কারণ একটি অক্ষত paramsঅবজেক্ট থাকার পরিবর্তে আপনার পরিবর্তে ভেরিয়েবলগুলি রয়েছে।

আপনি যদি ফাংশনটিতে কোনও কিছু পাস করার জন্য এটি alচ্ছিক করতে চান ?তবে প্রকারের সমস্ত কীগুলির জন্য একটি যুক্ত করুন ={}এবং প্রকার ঘোষণার পরে একটি ডিফল্ট যুক্ত করুন :

function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
    var name = first + " " + last;
    alert(name);
}

sayName();

এই সমাধানটি একটি আন্তঃসংযোগ কোড- হিন্টিং / ইন্টেলিজেন্স বৈশিষ্ট্য তৈরি করে কারণ এটি প্যারামিটারগুলি সম্পূর্ণরূপে ধ্বংসযুক্ত দেখায়। উদাহরণের মতো কয়েকটি পরামিতির চেয়ে বেশি সেটিংসের সেটিংসে আমি সেই স্টাইলটি দেখতে পাব না।
— ওয়্যার্ডপ্রাইরি

3
পরিবর্তে "sayNameSettings" এর মতো ইন্টারফেস / শ্রেণি ব্যবহার করার জন্য কি এই সমাধানটি পুনরায় লেখা সম্ভব?
— স্টিপ হেইনারথ

4
এটি কাজ করার সময়, এভাবে আর্গুমেন্টগুলি বিনষ্ট করে আইএমও অনুসরণ করা শক্ত করে তোলে।
— পিডব্লিউ কাদ

1
আপনি 'কীওয়ার্ড' হিসাবে ব্যবহার করতে পারেন (আমার মতে এটি আরও বেশি পঠনযোগ্য), যেমন Bob প্রথম = 'বব', শেষ = 'স্মিথ'} হিসাবে: প্রথম ?: স্ট্রিং; শেষ ?: স্ট্রিং} তবে আদর্শভাবে আপনার এই কেসগুলি হ্যান্ডেল করার জন্য একটি ইন্টারফেস তৈরি করা উচিত ...
— ফ্রেহলিচ

1
অপশনগুলি অন্য কোনও ক্রিয়াকলাপে পাস করার কোনও উপায় আছে কি?
— ডিলান্থেপিগুয়ে

50

টাইপস্ক্রিপ্ট এখন ডিফল্ট পরামিতি সমর্থন করে:

https://www.typescriptlang.org/docs/handbook/functions.html

এছাড়াও, একটি ডিফল্ট মান যোগ করা আপনাকে প্রকারের ঘোষণাটি বাদ দিতে দেয়, কারণ এটি ডিফল্ট মান থেকে অনুমান করা যায়:

function sayName(firstName: string, lastName = "Smith") {
  const name = firstName + ' ' + lastName;
  alert(name);
}

sayName('Bob');

22
এটি কীভাবে যুক্তি হিসাবে পাস করা টাইপসক্রিপ্ট অবজেক্টের ডিফল্ট মান সম্পর্কিত ওপির প্রশ্নের ক্ষেত্রে প্রযোজ্য? আপনি একটি বস্তুর যুক্তি সহ একটি উদাহরণ প্রদর্শন করা উচিত।
— ডিমেসেক্স

9
এটি হয় না তবে আমি সাধারণত এই টাইপস্ক্রিপ্টে কীভাবে ডিফল্ট পরামিতি সরবরাহ করতে পারি তা অনুসন্ধান করার সময় আমি এই প্রশ্নটি খুঁজে পেয়েছি এবং উত্তরগুলির কোনওটিরই এটিই সম্বোধন করা হয়নি। আমি সূক্ষ্ম "অবজেক্ট" পরম স্পষ্টতা লক্ষ্য করার আগে আমি এই প্রতিক্রিয়াও পোস্ট করেছিলাম।
— 30:30

27

প্যারামিটার অবজেক্টের ডেস্ট্রাকচারিং অবজেক্টটি উপরের উত্তরগুলির বেশিরভাগই লক্ষ্য করে যাচ্ছিল এবং টাইপস্ক্রিপ্টে এখন এমন পদ্ধতিগুলি রয়েছে যাতে এটি পড়া সহজ এবং স্বজ্ঞাতভাবে বুঝতে সক্ষম হয়।

বুনিয়াদি বুনিয়াদি: একটি বস্তুর ডেস্ট্রাকচার করে আপনি কী নামে কোনও বস্তু থেকে বৈশিষ্ট্য চয়ন করতে পারেন। আপনি নিজের পছন্দ মতো কয়েকটি বা তত সংখ্যক সংজ্ঞা নির্ধারণ করতে পারেন এবং ডিফল্ট মানগুলির একটি বেসিক সিনট্যাক্স দ্বারা সেট করা হয় let {key = default} = object।

let {firstName, lastName = 'Smith'} = myParamsObject;

//Compiles to:
var firstName = myParamsObject.firstName, 
_a = myParamsObject.lastName, 
lastName = _a === void 0 ? 'Smith' : _a;

প্যারামিটার অবজেক্টের জন্য একটি ইন্টারফেস, টাইপ বা শ্রেণি লিখলে সুগঠনতা উন্নত হয়।

type FullName = {
  firstName: string;
   
  /** @default 'Smith' */
  lastName ? : string;
}

function sayName(params: FullName) {

  // Set defaults for parameter object
  var { firstName, lastName = 'Smith'} = params;

  // Do Stuff
  var name = firstName + " " + lastName;
  alert(name);
}

// Use it
sayName({
  firstName: 'Bob'
});


3
আমি মনে করি এটিই প্রশ্নের সেরা উত্তর!
— গিজিম

24

না, টাইপস্ক্রিপ্টের এমন কোনও সংজ্ঞায়িত বস্তুর বৈশিষ্ট্যের জন্য ডিফল্ট সেট করার প্রাকৃতিক উপায় নেই যেখানে একটিতে ডিফল্ট থাকে এবং অন্যটির থাকে না। আপনি আরও সমৃদ্ধ কাঠামো সংজ্ঞায়িত করতে পারেন:

class Name {
    constructor(public first : string, 
        public last: string = "Smith") {

    }
}

এবং ইনলাইন টাইপ সংজ্ঞার জায়গায় এটি ব্যবহার করুন।

function sayName(name: Name) {
    alert(name.first + " " + name.last);
}

দুর্ভাগ্যক্রমে আপনি এরকম কিছু করতে পারবেন না:

function sayName(name : { first: string; last?:string } 
       /* and then assign a default object matching the signature */  
       = { first: null, last: 'Smith' }) {

} 

যেন এটি শুধুমাত্র ডিফল্ট সেট হবে nameছিল undefined।


আমি মনে করি এটি এই প্রশ্নের সেরা উত্তর এবং সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত।
— কাপাড

16

এটি করার একটি দুর্দান্ত উপায় হতে পারে যা দীর্ঘ নির্মাণকারীদের জড়িত না

class Person {
    firstName?: string = 'Bob';
    lastName?: string = 'Smith';

    // Pass in this class as the required params
    constructor(params: Person) {
        // object.assign will overwrite defaults if params exist
        Object.assign(this, params)
    }
}

// you can still use the typing 
function sayName(params: Person){ 
    let name = params.firstName + params.lastName
    alert(name)
}

// you do have to call new but for my use case this felt better
sayName(new Person({firstName: 'Gordon'}))
sayName(new Person({lastName: 'Thomas'}))

2
@ পিডাব্লু কেডের ডিফল্টগুলি দ্বিতীয় এবং তৃতীয় লাইনে "বব" এবং "স্মিথ"
— ক্যামেরন

3

ইন্টারফেস ব্যবহার করে এবং ডিফল্ট মান সহ ডেস্ট্রাকচার করার চেষ্টা করার জন্য এখানে কিছু। দয়া করে মনে রাখবেন যে "সর্বশেষ নাম" isচ্ছিক।

interface IName {
  firstName: string
  lastName?: string
}

function sayName(params: IName) {
  const { firstName, lastName = "Smith" } = params
  const fullName = `${firstName} ${lastName}`

  console.log("FullName-> ", fullName)
}

sayName({ firstName: "Bob" })

0

ডেস্ট্রাকচার না করে আপনি একটি ডিফল্ট প্যারাম তৈরি করতে এবং এতে পাস করতে পারেন

interface Name {
   firstName: string;
   lastName: string;
}

export const defaultName extends Omit<Name, 'firstName'> {
    lastName: 'Smith'
}

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