টাইপস্ক্রিপ্টে একটি পরিবর্তনশীল প্রকারটি কীভাবে পাবেন?


124

আমার একটি পরিবর্তনশীল আছে

abc:number|string;

আমি কীভাবে এটির পরীক্ষা করতে পারি? আমি নীচের মতো কিছু করতে চাই:

if (abc.type === "number") {
    // do something
}

উত্তর:


189

এর জন্য:

abc:number|string;

জাভাস্ক্রিপ্ট অপারেটর ব্যবহার করুন typeof:

if (typeof abc === "number") {
    // do something
}

টাইপস্ক্রিপ্ট বোঝে typeof🌹

একে টাইপগার্ড বলা হয়।

আরও

ক্লাসের জন্য আপনি instanceofযেমন ব্যবহার করবেন

class Foo {}
class Bar {} 

// Later
if (fooOrBar instanceof Foo){
  // TypeScript now knows that `fooOrBar` is `Foo`
}

এছাড়া অন্য ধরনের রক্ষীদের হয় যেমন inইত্যাদি https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html


6
instanceofযদিও এটি জিজ্ঞাসা করা প্রশ্ন ছিল না তবুও নোট যুক্ত করুন ।
— বাসারাত

43

যদি আপনি কোনও অবজেক্টের ব্যবহারের উদাহরণ তুলনা করতে চান তবে আমি টাইপগার্ডগুলি কেবল স্ট্রিং বা সংখ্যাগুলিতে কাজ করতে চাই

if(task.id instanceof UUID) {
  //foo
}

6
সত্য। আপনি এগুলি classএস সহ করে করতে পারেন তবে টাইপস্ক্রিপ্ট interfaceএস বা typeগুলি দিয়ে নয়, কারণ রফতানি করা জাভাস্ক্রিপ্ট ফাইলটিতে সেগুলি নেই।
— জোয়েটউইডল

11

আমি ভেরিয়েবলটি পরীক্ষা করে দেখেছি যদি এটি বুলিয়ান বা নীচের মতো না হয়

console.log(isBoolean(this.myVariable));

একইভাবে আমাদেরও আছে

isNumber(this.myVariable);
isString(this.myvariable);

ইত্যাদি।


4
আমার জন্য কাজ করেছে, তবে কেবল প্রকারগুলি জানার জন্য !!, কাস্টম প্রকারগুলি ব্যবহার করতে হবেinstanceof
— কার্লোস.ভি

4
আপনাকে utilএই ফাংশনগুলি অ্যাক্সেস করতে আমদানি করতে হবে (উদাহরণস্বরূপimport { isString } from 'util';
— 2

4
এখন অঙ্কিত, পরিবর্তে (টাইপফুল মান === 'স্ট্রিং') ব্যবহার করুন
— মনির খান

8

অন্যান্য উত্তরগুলি সঠিক, তবে আপনি যখন ইন্টারফেসের সাথে কাজ করছেন আপনি টাইপ বা উদাহরণ ব্যবহার করতে পারবেন না কারণ ইন্টারফেসগুলি জাভাস্ক্রিপ্টে সংকলিত হয় না।

পরিবর্তে আপনি আপনার ভেরিয়েবলটি পরীক্ষা করতে একটি টাইপকাস্ট + ফাংশন চেক টাইপগার্ড ব্যবহার করতে পারেন :

interface Car {
    drive(): void;
    honkTheHorn(): void;
}

interface Bike {
    drive(): void;
    ringTheBell(): void;
}

function start(vehicle: Bike | Car ) {
    vehicle.drive();

    // typecast and check if the function exists
    if ((<Bike>vehicle).ringTheBell) {
        const bike = (<Bike>vehicle);
        bike.ringTheBell();
    } else {
        const car = (<Car>vehicle);
        car.honkTheHorn();
    }
}

এবং এটি ES2017-এ সংকলিত জাভাস্ক্রিপ্ট:

function start(vehicle) {
    vehicle.drive();
    if (vehicle.ringTheBell) {
        const bike = vehicle;
        bike.ringTheBell();
    }
    else {
        const car = vehicle;
        car.honkTheHorn();
    }
}

ইন্টারফেস বনাম ক্লাস সম্পর্কে এটি একটি খুব গুরুত্বপূর্ণ পার্থক্য! আমি আশা করি এটি করার আরও একটি অলঙ্কৃত উপায় ছিল তবে এই পরামর্শটি ভালভাবে কাজ করে।
— 19:06

0

টাইপ স্ক্রিপ্টে প্রহরী টাইপ করুন

শর্তাধীন বিবৃতি দেওয়ার পরে কোনও ভেরিয়েবলের ধরণ নির্ধারণ করতে আপনি টাইপ গার্ড ব্যবহার করতে পারেন। টাইপস্ক্রিপ্টে একটি প্রকার রক্ষক নিম্নলিখিত:

একটি অভিব্যক্তি যা আপনাকে শর্তাধীন ব্লকের মধ্যে কোনও প্রকারের সংকোচন করতে দেয়।

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

উদাহরণ

declare let abc: number | string;

// typeof abc === 'string' is a type guard
if (typeof abc === 'string') {
    // abc: string
    console.log('abc is a string here')
} else {
    // abc: number, only option because the previous type guard removed the option of string
    console.log('abc is a number here')
}

এছাড়া typeofঅপারেটর মত টাইপ রক্ষীদের সেখানে আগে থেকেই রয়েছে instanceof, inএমনকি আপনার নিজের টাইপ প্রহরী ও।


0

আমার সন্দেহ হয় আপনি নিজের পদ্ধতির সামঞ্জস্য করতে পারেন এবং উদাহরণের পংক্তিতে কিছু ব্যবহার করতে পারেন:

https://www.typescriptlang.org/docs/handbook/advanced-tyype.html#user-defised-type-guards

function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.