টাইপস্ক্রিপ্ট কি সমর্থন করে? অপারেটর? (এবং, এটি কি বলা হয়?)


336

বর্তমানে টাইপস্ক্রিপ্ট এর নিরাপদ নেভিগেশন অপারেটরটিকে সমর্থন করে (বা এর পরিকল্পনা আছে)?.

অর্থাৎ,

var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;

এছাড়াও, এই অপারেটরের আরও একটি সাধারণ নাম আছে (এটি গুগল করার জন্য অন্তর্নিহিত কঠিন)।


3
@ ম্যাটটিটোমো আপনার কাছে সি # তে এটিকে নাল কোলেসিং অপারেটর বলা হয় এবং ব্যবহার করেন ?? সিনট্যাক্স ওয়েবলগস.এএসপি.এন.
স্কটগু

2
@BasaratAli দুর্ভাগ্যবশত না, একসঙ্গে বেড়ে ওঠা জন্য ভালো property ?? property2, কিন্তু যদি আপনি চেষ্টা property.company ?? property1.companyএবং propertyনাল, তাই আপনাকে একটি পেতে চাইNullReferenceException
mattytommo

1
@ ম্যাটটাইমো ধন্যবাদ আমি এখনই এটি পেয়েছি '?' আসলে চেইনে সমস্ত নাল রেফারেন্স ভিজিয়ে রাখে। মিষ্টি।
বাসরাত

9
@mattytommo এই সি # এখন অস্তিত্ব নেই: msdn.microsoft.com/en-us/library/dn986595.aspx
Highmastdon

9
মাইক্রোসফ্ট যে প্রতিনিধি আমাদের পরিদর্শন করেছে,
সেটিকে

উত্তর:


167

আপডেট : এটি টাইপস্ক্রিপ্ট ৩.7 হিসাবে সমর্থিত এবং ptionচ্ছিক চেইনিং নামে পরিচিত : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining

টাইপস্ক্রিপ্ট ভাষার স্পেসিফিকেশনে এর থেকে কোনও প্রকার খুঁজে পাচ্ছি না ।

কফিস্ক্রিপ্টে এই অপারেটরটিকে যতদূর বলা যায়, একে অস্তিত্বযুক্ত অপারেটর (বিশেষত, অস্তিত্বের অপারেটরের "এক্সেসর বৈকল্পিক") বলা হয়।

অপারেটরগুলিতে কফিস্ক্রিপ্টের ডকুমেন্টেশন থেকে :

অস্তিত্বের অপারেটরের অ্যাক্সেসরের বৈকল্পিক বৈশিষ্ট্যগুলির ?.একটি শৃঙ্খলে নাল রেফারেন্সগুলি ভিজিয়ে রাখতে ব্যবহার করা যেতে পারে। .বেস মানটি নাল বা অপরিজ্ঞাত হতে পারে এমন ক্ষেত্রে ডট অ্যাকসেসরের পরিবর্তে এটি ব্যবহার করুন ।

সুতরাং, অস্তিত্বের অপারেটরের অ্যাক্সেসর বৈকল্পিক এই অপারেটরটিকে উল্লেখ করার উপযুক্ত উপায় হিসাবে উপস্থিত বলে মনে হচ্ছে; এবং টাইপস্ক্রিপ্ট বর্তমানে এটি সমর্থন করে বলে মনে হচ্ছে না (যদিও অন্যরা এই কার্যকারিতাটির জন্য কোনও ইচ্ছা প্রকাশ করেছেন )।


28
"অস্তিত্বের অপারেটরের অ্যাকসেসর বৈকল্পিক"। স্বাভাবিকভাবে. এত আকর্ষণীয়, এটি ভুলে যাওয়া অসম্ভব near :)। চূড়ান্ত উত্তরের জন্য ধন্যবাদ।
মার্টি পিট

1
@ মার্টিপিট নিশ্চিত জিনিস! আমি সম্মত হই, আমি ক) এর মতো অপারেটরটির বৃহত্তর গ্রহণ (সি # প্লিজ!) এবং খ) আরও ভাল নাম (আপনার লিঙ্কযুক্ত ব্লগ পোস্টের "নিরাপদ নেভিগেশন" অপারেটরের এটির একটি সুন্দর রিং রয়েছে) দেখতে দেখতে আমি পছন্দ করব।
ডোনাট

2
কৌণিক এটি এর টেমপ্লেটগুলিতে এটি প্রয়োগ করে: কৌণিক.ইও
গাইড

5
অন্য কয়েকটি ভাষায় একে "এলভিস" অপারেটর বলা হয়
k0enf0rNL

4
এটি টাইপস্ক্রিপ্ট 7.০.০ ( github.com/microsoft/TypeScript/issues/… ) এর জন্য ঘোষণা করা হয়েছে
c_froehlich

146

একটি একক হিসাবে সুন্দর না?, কিন্তু এটি কাজ করে:

var thing = foo && foo.bar || null;

আপনি নিজের পছন্দ মতো আরও && ব্যবহার করতে পারেন:

var thing = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;

33
বিবৃতিটি যতক্ষণ সত্য হয় ততক্ষণ && মূল্যায়ন করে। যদি এটি সত্য হয় তবে এটি সর্বশেষ মানটি প্রদান করে। যদি এটি মিথ্যা হয় তবে এটি প্রথম মানটিকে মিথ্যা হিসাবে মূল্যায়ন করে। এটি 0, নাল, মিথ্যা ইত্যাদি হতে পারে || সত্যকে মূল্যায়ন করে এমন প্রথম মানটি প্রদান করে।
এ। কেআর

34
বারটি সংজ্ঞায়িত করা হলেও মিথ্যা (বুলিয়ান মিথ্যা, বা শূন্যের মতো) মূল্যায়ন করলে ভাল কাজ করে না।
mt_serg

96

এটি ECMAScript ptionচ্ছিক চেইনিং স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে, সুতরাং আমরা যখন এটি আলোচনা করব তখন সম্ভবত আমাদের সম্ভবত optionচ্ছিক শৃঙ্খলা উল্লেখ করা উচিত । সম্ভবত বাস্তবায়ন:

const result = a?.b?.c;

এর একটি দীর্ঘ এবং সংক্ষিপ্তটি হ'ল টাইপস্ক্রিপ্ট টিমটি ইসমাস্ক্রিপ্টের বিশদকরণটি আরও শক্তিশালী হওয়ার জন্য অপেক্ষা করছে, যাতে ভবিষ্যতে তাদের প্রয়োগ বাস্তবায়িত হতে পারে। যদি তারা এখনই কিছু বাস্তবায়িত করে থাকে, তবে ECMAScript তাদের স্পেসিফিকেশনটিকে নতুন করে সংজ্ঞায়িত করলে বড় পরিবর্তনগুলির প্রয়োজন হবে।

Iningচ্ছিক চেইনিংয়ের বিশদ বিবরণ দেখুন

যেখানে কোনও কিছুই মানসম্মত জাভাস্ক্রিপ্ট হতে চলেছে না, টাইপস্ক্রিপ্ট দলটি যথাযথ হিসাবে দেখলে তা প্রয়োগ করতে পারে, তবে ভবিষ্যতের ECMAScript সংযোজনগুলির জন্য, তারা আরও অনেকগুলি বৈশিষ্ট্যের জন্য যেমন প্রাথমিক অ্যাক্সেস দেয় এমনকি তারা শব্দার্থ সংরক্ষণ করতে চায় se

শর্ট কাটস

সুতরাং জাভা স্ক্রিপ্টগুলির সমস্ত মজাদার অপারেটর যেমন ধরণের রূপান্তরগুলি সহ উপলভ্য ...

var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool

ম্যানুয়াল সমাধান

তবে আবার প্রশ্নে। আপনি কীভাবে জাভাস্ক্রিপ্টে (এবং তাই টাইপস্ক্রিপ্ট) অনুরূপ কাজটি করতে পারেন তার একটি আবদ্ধ উদাহরণ রয়েছে যদিও আমি অবশ্যই প্রস্তাব দিচ্ছি না যে এটি আপনি যে বৈশিষ্ট্যটির পরে রয়েছেন তেমন একটি করুণ grace

(foo||{}).bar;

তাই আপনি যদি fooহয় undefinedফল undefinedএবং যদি fooসংজ্ঞায়িত করা হয় এবং নামে একজন সম্পত্তি রয়েছে barএকটি মান আছে, ফলে মান।

আমি জেএসফিডেলে একটি উদাহরণ রেখেছি

এটি দীর্ঘ উদাহরণগুলির জন্য বেশ স্কেচি দেখায়।

var postCode = ((person||{}).address||{}).postcode;

চেইন ফাংশন

স্পেসিফিকেশনটি এখনও বায়ুতে থাকা অবস্থায় আপনি যদি সংক্ষিপ্ত সংস্করণের জন্য মরিয়া হয়ে থাকেন তবে আমি কিছু ক্ষেত্রে এই পদ্ধতিটি ব্যবহার করি use এটি অভিব্যক্তিটি মূল্যায়ন করে এবং যদি শৃঙ্খলাটি সন্তুষ্ট না হতে পারে বা শূন্য / অপরিজ্ঞাত না হয়ে যায় তবে এটি একটি ডিফল্ট ফিরিয়ে দেয় ( !=এখানে গুরুত্বপূর্ণটি উল্লেখ করুন, আমরা এখানে কিছুটা ইতিবাচক জাগল চাইায় আমরা ব্যবহার করতে চাই না!== )।

function chain<T>(exp: () => T, d: T) {
    try {
        let val = exp();
        if (val != null) {
            return val;
        }
    } catch { }
    return d;
}

let obj1: { a?: { b?: string }} = {
    a: {
        b: 'c'
    }
};

// 'c'
console.log(chain(() => obj1.a.b, 'Nothing'));

obj1 = {
    a: {}
};

// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));

obj1 = {};

// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));

obj1 = null;

// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));

1
আকর্ষণীয় কিন্তু আমার ক্ষেত্রে (this.loop || {}).nativeElementবলার অপেক্ষা রাখে না Property 'nativeElement' does not exist on type '{}'. any this.looptypeof angular.io/api/core/ElementRef
kuncevic.dev

@ কুনসেভিক - আপনার প্রয়োজন হয় ... 1) এর পরিবর্তে একটি সামঞ্জস্যপূর্ণ ডিফল্ট সরবরাহ করতে হবে {}, বা 2) সংকলকটি নিঃশব্দ করার জন্য এক প্রকারের দৃ use়তা ব্যবহার করুন।
ফেন্টন

ধরে fooনেওয়া একটি আসল দরকারী অবজেক্ট: (foo || {}).barসাধারণত টাইপ স্ক্রিপ্টে সংকলন করতে যাচ্ছে না কারণ {}একই ধরণের হবে না foo। @ VeganHunter এর সমাধানটি এড়ানো এটাই সমস্যা That's
সাইমন_ ওয়েভার

1
@ সিমন_আপনি তখন (foo || {বার})। বারটি সংকলকটি সুচারুভাবে চলতে দেবে এবং আমি মনে করি যে ভারবোসিটি গ্রহণযোগ্য।
হার্পস

@ হার্পস আসলে এটি কেবল তখনই সংকলিত হয় যখন বারটি পরিবর্তনশীল হিসাবে সংজ্ঞায়িত করা হয়, যা সম্ভবত এটিই হবে না
সাইমন_উইভার

82

আপডেট: হ্যাঁ এটি এখন সমর্থিত!

এটি সবেমাত্র টাইপস্ক্রিপ্ট ৩.7 সহ প্রকাশিত হয়েছে: https://devblogs.microsoft.com/tyypecript/announcing-typescript-3-7/

একে alচ্ছিক শৃঙ্খলা বলা হয় : https://devblogs.microsoft.com/typescript/annoucing-typescript-3-7/#optional-chaining

এটি দিয়ে নিম্নলিখিত:

let x = foo?.bar.baz(); 

সমান:

let x = (foo === null || foo === undefined) ?
    undefined :
    foo.bar.baz();

পুরানো উত্তর

গিথুবে এটির জন্য একটি মুক্ত বৈশিষ্ট্য অনুরোধ রয়েছে যেখানে আপনি আপনার মতামত / আকাঙ্ক্ষাকে ভয়েস করতে পারেন: https://github.com/Mic Microsoft/TypeScript/issues/16


36

13 নভেম্বর, 2019 সম্পাদনা করুন!

নভেম্বর 5, 2019 পর্যন্ত টাইপস্ক্রিপ্ট 3.7 প্রেরণ করা হয়েছে এবং এটি এখন ?. alচ্ছিক চেইন অপারেটরটিকে সমর্থন করে 🎉🎉🍾🍾🎉 !!!

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining


শুধুমাত্র Histতিহাসিক উদ্দেশ্যগুলির জন্য:

সম্পাদনা: আমি উত্তর আপডেট করেছি fracz মন্তব্যে ধন্যবাদ।

টাইপস্ক্রিপ্ট ২.০ প্রকাশিত !.এটি এর মতো নয়?. (সি # তে নিরাপদ নেভিগেটর)

আরও তথ্যের জন্য এই উত্তর দেখুন:

https://stackoverflow.com/a/38875179/1057052

এটি কেবলমাত্র সংকলককে বলবে যে মানটি নাল বা অপরিজ্ঞাত নয়। এটি মান বাতিল বা অপরিজ্ঞাত কিনা তা পরীক্ষা করবে না

টাইপস্ক্রিপ্ট অ-নাল দৃull়তা অপারেটর

// Compiled with --strictNullChecks
function validateEntity(e?: Entity) {
    // Throw exception if e is null or invalid entity
}

function processEntity(e?: Entity) {
    validateEntity(e);
    let s = e!.name;  // Assert that e is non-null and access name
}

4
?এটির মতো নয় কারণ এটি দৃ that ়ভাবে দাবি করে যে মানটি সংজ্ঞায়িত হয়েছে। ?প্রত্যাশিত চুপচাপ ব্যর্থ / মিথ্যা মূল্যায়ন। যাইহোক, জেনে রাখা ভাল।
fracz

1
এখন আমি এটি সম্পর্কে ভাবি ... এই উত্তরটি বেশ অর্থহীন, কারণ এটি সি # অপারেটর যে "নিরাপদ নেভিগেশন" করে না।
জোসে এ

5
যদিও এটি আমার প্রশ্নের উত্তর দিয়েছে। আমি জানতাম? সি # থেকে এবং এটি টাইপ স্ক্রিপ্টে চেষ্টা করে। এটি কাজ করে না, তবে আমি তা দেখেছি! অস্তিত্ব আছে কিন্তু কী করেছিল তা জানেনি। আমি ভাবছিলাম যে এটি একই ছিল কিনা, একটি গুগল অনুসন্ধান করেছে এবং এই প্রশ্নের আমার পথ খুঁজে পেয়েছে যা আমাকে জানিয়েছে যে না, তারা আলাদা।
ল্লেউই

11

এলভিস (?) Ptionচ্ছিক চেইনিং অপারেটর টাইপস্ক্রিপ্ট 3.7 তে সমর্থিত।

নাল মানগুলি যাচাই করতে আপনি এটি ব্যবহার করতে পারেন: cats?.miowsবিড়ালগুলি শূন্য বা সংজ্ঞায়িত হলে নাল ফেরান।

আপনি এটি বিকল্প পদ্ধতি কল করার জন্যও ব্যবহার করতে পারেন: cats.doMiow?.(5) চ্ছিক যদি এটি বিদ্যমান থাকে তবে doMiow কল করবেন।

সম্পত্তির অ্যাক্সেসও সম্ভব: cats?.['miows']

তথ্যসূত্র: https://devblogs.microsoft.com/tyypecript/annoucing-tyypecript-3-7-beta/


দয়া করে আমাকে সংশোধন করুন, তবে এলভিস অপারেটর কমপক্ষে কোটলিনে আছেন ?:। আপনার কি রেফারেন্স আছে?
rekire

@ রেইকায়ার: ডেভলগস.মাইক্রোসফট. / টাইপসক্রিপশন_…
সুপারলুমিনিয়

1
এটি শীঘ্রই প্লেইন জেএস-এ সমর্থিত হবে - বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস


10

অপারেটর ?.টাইপস্ক্রিপ্ট সংস্করণ ২.০ এ সমর্থিত নয় ।

সুতরাং আমি নিম্নলিখিত ফাংশন ব্যবহার:

export function o<T>(someObject: T, defaultValue: T = {} as T) : T {
    if (typeof someObject === 'undefined' || someObject === null)
        return defaultValue;
    else
        return someObject;
}

ব্যবহার এর মত দেখাচ্ছে:

o(o(o(test).prop1).prop2

এছাড়াও, আপনি একটি ডিফল্ট মান সেট করতে পারেন:

o(o(o(o(test).prop1).prop2, "none")

এটি ভিজুয়াল স্টুডিওতে ইন্টেলিজেন্সের সাথে সত্যই ভাল কাজ করে।


1
আমি ঠিক এটিই খুঁজছিলাম! এটি টাইপস্ক্রিপ্ট ২.১..6 এ কাজ করে।
রজব শাকিরভ

5
অথবা আপনি এটি কল করতে পারেন elvis<T>;-)
সাইমন_উইভার

3
সাইমন_উইভার, আমি এটিকে "দু: খিত ক্লাউন" বলি: ও (
VeganHunter

5

শেষ পর্যন্ত এখানে!

এখানে কিছু উদাহরণ আছে:

// properties
foo?.bar
foo?.bar()
foo?.bar.baz()
foo?.bar?.baz()

// indexing
foo?.[0]
foo?.['bar']

// check if a function is defined before invoking
foo?.()
foo.bar?.()
foo?.bar?.()

তবে এটি আপনার অনুমানের মতো কাজ করে না।

পরিবর্তে মূল্যায়ন

foo?.bar

এই ছোট কোড স্নিপেট আমরা সবাই লিখতে অভ্যস্ত

foo ? foo.bar : null

এটি আসলে মূল্যায়ন করে

(foo === null || foo === undefined) ?
    undefined :
    foo.bar

যা খালি স্ট্রিং, 0 বা ভুয়ের মতো সমস্ত মিথ্যা মানগুলির জন্য কাজ করে।

তারা কেন এটি সংকলন করে না সে সম্পর্কে আমার কাছে কেবল কোনও ব্যাখ্যা নেই foo == null


3

ফোনেট্রাডারে কাজ করার সময় আমরা এই ব্যবহারের পদ্ধতিটি তৈরি করেছি যা আপনাকে টাইপস্ক্রিপ্টের সাহায্যে গভীর বৈশিষ্ট্যে টাইপ-নিরাপদ অ্যাক্সেস দিতে পারে:

/**
 * Type-safe access of deep property of an object
 *
 * @param obj                   Object to get deep property
 * @param unsafeDataOperation   Function that returns the deep property
 * @param valueIfFail           Value to return in case if there is no such property
 */
export function getInSafe<O,T>(obj: O, unsafeDataOperation: (x: O) => T, valueIfFail?: any) : T {
    try {
        return unsafeDataOperation(obj)
    } catch (error) {
        return valueIfFail;
    }
}

//Example usage:
getInSafe(sellTicket, x => x.phoneDetails.imeiNumber, '');

//Example from above
getInSafe(foo, x => x.bar.check, null);


Cool !! কোন সতর্কতা আছে? আমার প্রায় 20 জন লেখার জন্য একটি মোড়কের ক্লাস রয়েছে, তাদের প্রত্যেকেরই নিম্নলিখিত ধরণের রিটার্ন রয়েছে - এবং সমস্ত ক্ষেত্র return this.entry.fields.featuredImage.fields.file.url;
নালাগুলি

একমাত্র সতর্কতা সম্ভবত পারফরম্যান্সের প্রভাব হতে পারে, তবে বিভিন্ন JITers কীভাবে এটি পরিচালনা করে তা বলার মতো আমি যোগ্য নই।
রায় Suelzer

2

আমি সাধারণত এই পদ্ধতির সুপারিশ করি না (পারফরম্যান্স সম্পর্কিত উদ্বেগগুলি লক্ষ্য রাখুন), তবে আপনি স্প্রেড অপারেটরটিকে অল্প অল্প করে কোনও বস্তু ক্লোন করতে ব্যবহার করতে পারেন, যার পরে আপনি সম্পত্তিটি অ্যাক্সেস করতে পারবেন।

 const person = { personId: 123, firstName: 'Simon' };
 const firstName = { ...person }.firstName;

এটি কাজ করে কারণ 'ফার্স্টনাম' ধরণের মাধ্যমে 'প্রচারিত' হয়।

আমি এটি সবচেয়ে ঘন ঘন ব্যবহার করব যখন আমার কোনও find(...)অভিব্যক্তি আসে যা শূন্য ফিরে আসতে পারে এবং এ থেকে আমার একক সম্পত্তি প্রয়োজন:

 // this would cause an error (this ID doesn't exist)
 const people = [person];
 const firstName2 = people.find(p => p.personId == 999).firstName;

 // this works - but copies every property over so raises performance concerns
 const firstName3 = { ...people.find(p => p.personId == 999) }.firstName;

যেভাবে টাইপসক্রিপ্ট ইনফার টাইপ করে এবং এটি সংকলন করে না সেগুলি নিয়ে কয়েকটি প্রান্তের ঘটনাও থাকতে পারে তবে এটি সাধারণত কাজ করা উচিত।


2

একে optionচ্ছিক শৃঙ্খলা বলা হয় এবং এটি টাইপস্ক্রিপ্ট ৩. 3. এ রয়েছে

Chaচ্ছিক শৃঙ্খলা আমাদের কোড লিখতে দেয় যেখানে আমরা কোনও শূন্যস্থান বা অপরিজ্ঞায়িত হয়ে গেলে কিছু অভিব্যক্তিগুলি তত্ক্ষণাত বন্ধ করতে পারি we


0

পূর্বে উত্তর হিসাবে, এটি এখনও বিবেচনা করা হচ্ছে তবে এটি কয়েক বছর ধরে পানিতে মারা গেছে।

বিদ্যমান উত্তরের উপর ভিত্তি করে তৈরি করা, এখানে আমি সবচেয়ে সংক্ষিপ্ত ম্যানুয়াল সংস্করণটি ভাবতে পারি:

jsfiddle

function val<T>(valueSupplier: () => T): T {
  try { return valueSupplier(); } catch (err) { return undefined; }
}

let obj1: { a?: { b?: string }} = { a: { b: 'c' } };
console.log(val(() => obj1.a.b)); // 'c'

obj1 = { a: {} };
console.log(val(() => obj1.a.b)); // undefined
console.log(val(() => obj1.a.b) || 'Nothing'); // 'Nothing'

obj1 = {};
console.log(val(() => obj1.a.b) || 'Nothing'); // 'Nothing'

obj1 = null;
console.log(val(() => obj1.a.b) || 'Nothing'); // 'Nothing'

সম্পত্তি খালি হারিয়ে যাওয়ার ক্ষেত্রে এটি নিঃশব্দে ব্যর্থ হয়। এটি ডিফল্ট মান নির্ধারণের জন্য স্ট্যান্ডার্ড সিনট্যাক্সে ফিরে আসে, যা পুরোপুরি বাদও দেওয়া যেতে পারে।


যদিও এটি সাধারণ ক্ষেত্রে কাজ করে, আপনার যদি আরও জটিল জিনিস যেমন কোনও ফাংশন কল করার এবং ফলাফলটির পরে কোনও সম্পত্তি অ্যাক্সেসের প্রয়োজন হয় তবে অন্য কোনও ত্রুটিও গ্রাস করা হবে। খারাপ নকশা।

উপরের ক্ষেত্রে, এখানে পোস্ট করা অন্য উত্তরের একটি অনুকূলিত সংস্করণ হ'ল আরও ভাল বিকল্প:

jsfiddle

function o<T>(obj?: T, def: T = {} as T): T {
    return obj || def;
}

let obj1: { a?: { b?: string }} = { a: { b: 'c' } };
console.log(o(o(o(obj1).a)).b); // 'c'

obj1 = { a: {} };
console.log(o(o(o(obj1).a)).b); // undefined
console.log(o(o(o(obj1).a)).b || 'Nothing'); // 'Nothing'

obj1 = {};
console.log(o(o(o(obj1).a)).b || 'Nothing'); // 'Nothing'

obj1 = null;
console.log(o(o(o(obj1).a)).b || 'Nothing'); // 'Nothing'

আরও জটিল উদাহরণ:

o(foo(), []).map((n) => n.id)

আপনি অন্য পথেও যেতে পারেন এবং লোডাশের মতো কিছু ব্যবহার করতে পারেন _.get()। এটি সংক্ষিপ্ত, তবে সংকলক ব্যবহৃত বৈশিষ্ট্যের বৈধতা বিচার করতে সক্ষম হবে না:

console.log(_.get(obj1, 'a.b.c'));

0

এখনও (সেপ্টেম্বর, 2019 হিসাবে) নয়, তবে "নিরাপদ নেভিগেশন অপারেটর" এখন স্টেজ 3 এ , তাই এটি টাইপস্ক্রিপ্টে প্রয়োগ করা হচ্ছে।

আপডেটের জন্য এই সমস্যাটি দেখুন:

https://github.com/microsoft/TypeScript/issues/16

বেশ কয়েকটি ইঞ্জিনের প্রাথমিক প্রয়োগ রয়েছে:

জেএসসি: https://bugs.webkit.org/show_bug.cgi?id=200199

ভি 8: https://bugs.chromium.org/p/v8/issues/detail?id=9553

এসএম: https://bugzilla.mozilla.org/show_bug.cgi?id=1566143

( https://github.com/tc39/proposal-optional-chaining/issues/115#issue-475422578 এর মাধ্যমে )

এখনই এটি সমর্থন করার জন্য আপনি একটি প্লাগইন ইনস্টল করতে পারেন:

npm install --save-dev ts-optchain

আপনার tsconfig.json এ:

// tsconfig.json
{
    "compilerOptions": {
        "plugins": [
            { "transform": "ts-optchain/transform" },
        ]
    },
}

আমি আশা করি এই উত্তরটি আগামী 6 মাস বা তার বেশি সময়ের মধ্যে পুরানো হয়ে যাবে, তবে আশা করি এর মধ্যে এটি কারওর পক্ষে সহায়তা করবে।


-1

_.get(obj, 'address.street.name')জাভাস্ক্রিপ্টের জন্য দুর্দান্ত কাজ করে যেখানে আপনার কোনও প্রকার নেই। তবে টাইপস্ক্রিপ্টের জন্য আমাদের আসল এলভিস অপারেটরটি দরকার!

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