টাইপস্ক্রিপ্ট ইন্টারফেসের ধরণের ধরণের "নিষ্কাশন" করার কোনও উপায় আছে কি?


115

ধরা যাক এক্স লাইব্রেরির জন্য টাইপিং ফাইল রয়েছে যার মধ্যে কয়েকটি ইন্টারফেস রয়েছে।

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

এই লাইব্রেরির সাথে কাজ করার জন্য আমার কাছে এমন একটি বস্তুর চারপাশে পাসের দরকার যা ঠিক একই ধরণের I2.y। আমি অবশ্যই আমার উত্স ফাইলগুলিতে অভিন্ন ইন্টারফেস তৈরি করতে পারি:

interface MyInterface {
    a: I1,
    b: I1,
    c: I1
}

let myVar: MyInterface;

তবে আমি এটি লাইব্রেরি থেকে এক সাথে আপ টু ডেট রাখার বোঝা পেয়েছি, তদুপরি এটি খুব বড় হতে পারে এবং কোডের নকলের প্রচুর ফলাফল হতে পারে।

সুতরাং, ইন্টারফেসের এই নির্দিষ্ট সম্পত্তিটির ধরণের "নিষ্কাশন" করার কোনও উপায় আছে কি? এর অনুরূপ কিছু let myVar: typeof I2.y(যা কাজ করে না এবং "I2 নামটি খুঁজে পাচ্ছে না" এর ত্রুটির ফলাফল)। আগাম ধন্যবাদ.


সম্পাদনা করুন : টিএস প্লেগ্রাউন্ডে কিছুটা খেলার পরে আমি লক্ষ্য করেছি যে নিম্নলিখিত কোডগুলি আমি যা চাই ঠিক তা অর্জন করে:

declare var x: I2;
let y: typeof x.y;

তবে এটির জন্য একটি অতিরিক্ত কাজ xকরতে হবে vari আমি এই ঘোষণা ছাড়াই এটি অর্জনের জন্য একটি উপায় খুঁজছি।


4
যা কাজ করে না - তা কীভাবে প্রকাশ পায়? আপনি দেখতে পাচ্ছেন আসল ত্রুটি বার্তাটি কী?
বার্তেক বনচেউইচজ

@ বার্তেকবানাচিউইচ আপডেট হয়েছে
কুবা

উত্তর:


232

এটি আগে সম্ভব ছিল না তবে ভাগ্যক্রমে এটি এখন, কারণ টাইপস্ক্রিপ্ট সংস্করণ ২.১ । এটি ২০১ December সালের December ই ডিসেম্বর প্রকাশিত হয়েছে এবং এটি সূচকযুক্ত অ্যাক্সেসের প্রকারগুলি প্রবর্তন করে যা প্রকারভেদ প্রকারগুলিও বলে

বাক্য গঠনটি হ'ল উপাদান অ্যাক্সেসের মতো দেখায় তবে বিভিন্ন জায়গায় লেখা। সুতরাং আপনার ক্ষেত্রে:

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

let myVar: I2['y'];  // indexed access type

এখন myVarটাইপ আছে I2.y

এটি টাইপস্ক্রিপ্ট খেলার মাঠে পরীক্ষা করে দেখুন ।


4
ক্ষেত্রে যখন 'y' একটি অ্যারে হয়, তখন উপাদানগুলির ধরণটি বের করার কোনও উপায় আছে কি? যেমন I2 {y: {..} []}
জন বি

4
@ জনবি হ্যাঁ, আপনি এটি ঠিক একই পদ্ধতিতে করতে পারেন, কারণ অ্যারে সূচকগুলি ঠিক বস্তুর বৈশিষ্ট্যের মতো। এটি এখানে দেখুন: typcriptlang.org/play/…
কুবা জাগোদা 8'18

4
@ জনবি হ্যাঁ, আপনি এটি একইভাবে অ্যাক্সেস করতে পারেন। I2['y'][0]দেখুন: typescriptlang.org/play/...
মাইকেল Miszczyszyn

4
এটি সত্যিই দুর্দান্ত ক্ষমতা
জেরাদ্লাস_আরউ

4
আসুন ধরে নেওয়া যাক আমরা I2টাইপ হিসাবে ব্যবহার করে কোনও বস্তুর কীগুলি লুপ করছি । লুপিংয়ের সময় আমি কীভাবে একটি নির্দিষ্ট কী প্রকারটি ডায়নামিকভাবে পেতাম। এই; let z: typeof x[a];, aস্ট্রিং হিসাবে একটি নির্দিষ্ট কী যেখানে কাজ করে না। এটি আমাকে বলে যে aকোনও মানকে বোঝায় এবং কোনও প্রকারের সাথে উল্লেখ করতে হবে। আমি কীভাবে এটি করতে যাব? এটি কি কোনওভাবেই সম্ভব? ধন্যবাদ!
এমিল ওয়ালসার

-1

একটি ইন্টারফেস একটি বস্তুর সংজ্ঞা মত হয়। তারপরে y হ'ল আপনার আই 2 অবজেক্টের সম্পত্তি, এটি একটি নির্দিষ্ট ধরণের, সেই ক্ষেত্রে "বেনামে"।

আপনি y এর সংজ্ঞা দিতে অন্য ইন্টারফেস ব্যবহার করতে পারেন এবং তারপরে এটি আপনার y টাইপ হিসাবে ব্যবহার করতে পারেন

interface ytype {
   a: I1;
   b: I1;
   c: I1;
}

interface I2 {
    y: ytype;
    z: any;
}

আপনি আপনার ইন্টারফেসটি কোনও ফাইলে রাখতে পারেন এবং এক্সট্র্যাক্ট ব্যবহার করতে পারেন যাতে আপনি এটি আপনার প্রকল্পের অন্যান্য ফাইলগুলিতে আমদানি করতে পারেন

export interface ytype {
   a: I1;
   b: I1;
   c: I1;
}



 export interface I2 {
        y: ytype;
        z: any;
    }

আপনি এটি সেভাবে আমদানি করতে পারেন:

   import {I1, I2, ytype} from 'your_file'

সবকিছু ঠিক আছে, তবে যেমনটি আমি উল্লেখ করেছি - ইন্টারফেসগুলি I1 এবং I2 একটি বাহ্যিক লাইব্রেরি থেকে আসে এবং সেই লাইব্রেরির জন্য d.ts ফাইলে সংজ্ঞায়িত করা হয়। সুতরাং এই ytype ইন্টারফেসটি একটি কোড সদৃশ হবে এবং ক্রমাগত আপডেট করা প্রয়োজন।
কুবা জাগোদা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.