`িস` কীওয়ার্ডটি টাইপস্ক্রিপ্টে কী করে?


114

আমি এমন কিছু কোড জুড়ে এসেছি যা দেখতে দেখতে এটি দেখতে:

export function foo(arg: string): arg is MyType {
    return ...
}

আমি isডক্স বা গুগল উভয়ের মধ্যে অনুসন্ধান করতে সক্ষম হইনি , এটি একটি দুর্দান্ত সাধারণ শব্দ এবং মূলত প্রতিটি পৃষ্ঠায় প্রদর্শিত হয়।

কীওয়ার্ড সেই প্রসঙ্গে কি করে?

উত্তর:


126
function isString(test: any): test is string{
    return typeof test === "string";
}

function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length); // string function
    }
}
example("hello world");

উপরের বিন্যাসে প্রেজিকেট "টেস্ট স্ট্রিং" টাইপ ব্যবহার করে (রিটার্ন টাইপের জন্য কেবল বুলিয়ান ব্যবহারের পরিবর্তে, স্ট্রিং () বলা হওয়ার পরে, যদি ফাংশনটি সত্য হয়, টাইপস্ক্রিপ্ট কোনও ব্লক দ্বারা সুরক্ষিত যে কোনও ব্লকের স্ট্রিংটিতে টাইপকে সংকীর্ণ করবে Type ফাংশনটিতে কল করুন The

{
    console.log("it is a string" + foo);
    console.log(foo.length); // string function
}

টাইপ প্রিকিট সবেমাত্র সংকলনের সময় ব্যবহৃত হয়। ফলাফল .js ফাইলের (রানটাইম) কোনও পার্থক্য থাকবে না কারণ এটি টিওয়াইপিই বিবেচনা করে না।

আমি নীচের চারটি উদাহরণের মধ্যে পার্থক্যগুলি বর্ণনা করব।

উদাহরণস্বরূপ 1: উপরের উদাহরণ কোডটিতে সংকলন ত্রুটি এবং রানটাইম ত্রুটি থাকবে না।

উদাহরণস্বরূপ 2: নীচের উদাহরণ কোডটিতে সংকলন ত্রুটি থাকবে (সেই সাথে রানটাইম ত্রুটিও) কারণ টাইপস্ক্রিপ্ট টাইপটিকে স্ট্রিংয়ে সংকীর্ণ করেছে এবং পরীক্ষা করেছে যে টেক্সএফসেনশিয়ালটি স্ট্রিং পদ্ধতির সাথে সম্পর্কিত নয়।

function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length);
        console.log(foo.toExponential(2));
    }
}

উদাহরণস্বরূপ 3: নীচের উদাহরণ কোডটিতে সংকলন ত্রুটি নেই তবে রানটাইম ত্রুটি থাকবে কারণ টাইপস্ক্রিপ্ট কেবল প্রকারের মধ্যে থাকা ব্লকটিতে স্ট্রিংটি টাইপকে সংকীর্ণ করবে কিন্তু এর পরে নয়, সুতরাং foo.toE এক্সপোশেনশিয়ালটি সংকলন ত্রুটি তৈরি করবে না (টাইপস্ক্রিপ্ট এটি মনে করে না একটি স্ট্রিং টাইপ)। যাইহোক, রানটাইমে স্ট্রিংয়ের টো এক্সপেনশিয়াল পদ্ধতি নেই, সুতরাং এতে রানটাইম ত্রুটি থাকবে।

function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length);
    }
    console.log(foo.toExponential(2));
}

উদাহরণস্বরূপ 4: যদি আমরা "টেস্ট ইজ স্ট্রিং" (টাইপ প্রিডিকেট) না ব্যবহার করি তবে টাইপসক্রিপ্টটি ব্লক রক্ষিত প্রকারকে সংকীর্ণ করবে না এবং নীচের উদাহরণ কোডটিতে সংকলন ত্রুটি থাকবে না তবে এতে রানটাইম ত্রুটি থাকবে।

function isString(test: any): boolean{
    return typeof test === "string";
}
function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length);
        console.log(foo.toExponential(2));
    }
}

উপসংহারটি হ'ল "টেস্ট ইজ স্ট্রিং" (টাইপ প্রিকেট) সংকলন-সময়ে ডেভেলপারদের বলার জন্য কোডটি রানটাইম ত্রুটি হওয়ার সুযোগ পাবে used জাভাস্ক্রিপ্টের জন্য, বিকাশকারীরা সংকলনের সময় ত্রুটিটি জানবেন না। এটি টাইপস্ক্রিপ্ট ব্যবহার করার সুবিধা।


12

আমি জানি কেবলমাত্র ব্যবহারটি হ'ল আপনার উদাহরণগুলির arg is MyTypeমধ্যে একটি: কোনও ব্যবহারকারী সংজ্ঞায়িত টাইপ গার্ডে "টাইপ প্রিডিকেট" ( ) নির্দিষ্ট করে

এই রেফারেন্সে ব্যবহারকারী সংজ্ঞায়িত টাইপ গার্ডগুলি দেখুন

এখানে আরও একটি উল্লেখ রয়েছে


4
আমি এটি ডক্সগুলিতেও দেখেছি, কী উদ্ভট ডিজাইনের সিদ্ধান্ত, এই প্রকারটি পুরোপুরি পরিচালনা করা যেতে পারে কোনও প্রকারের booleanঅধিকার ফিরে দিয়ে ?
— বেনজামিনজ

4
@ বেনজামিনজ এটি হয়ত নিজের প্রশ্নের উত্তর দেয় তবে তারা কীভাবে আলাদা তার একটি দ্রুত উদাহরণ আমি আপনাকে দেখাতে পারি। isশব্দ আসলে কোড পরবর্তী ধরণ এবং করতে পারেন ধরা টাইপ ত্রুটি কাস্ট করছে। আরও তথ্যের জন্য এই উদাহরণটি দেখুন ।
— স্টাইলফেল

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