টাইপস্ক্রিপ্ট: ইন্টারফেস বনাম প্রকার


712

এই বিবৃতিগুলির মধ্যে পার্থক্য কী (ইন্টারফেস বনাম টাইপ)?

interface X {
    a: number
    b: string
}

type X = {
    a: number
    b: string
};

4
পার্থক্যগুলি ব্যাখ্যা করে এই নিবন্ধটি খুঁজে পেয়েছেন - मध्यम.com
সন্দীপ জিবি

উত্তর:


572

অনুযায়ী টাইপ করা বিষয় ভাষা নির্দিষ্টকরণ :

একটি ইন্টারফেস ঘোষণার বিপরীতে, যা সর্বদা নামযুক্ত বস্তুর প্রকারের পরিচয় দেয়, একটি প্রকারের উপনাম ঘোষণার মাধ্যমে আদিম, ইউনিয়ন এবং ছেদ করার ধরণগুলি সহ যে কোনও ধরণের জন্য নাম পরিচয় করানো যেতে পারে।

স্পেসিফিকেশন উল্লেখ করা যায়:

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

interface Point {
    x: number;
    y: number;
}

টাইপ ওরফে হিসাবে লেখা যেতে পারে

type Point = {
    x: number;
    y: number;
};

যাইহোক, এটি করার অর্থ নিম্নলিখিত ক্ষমতাগুলি হারিয়ে গেছে:

  • একটি ইন্টারফেসকে প্রসারিত বা প্রয়োগকারী ধারাটিতে নাম দেওয়া যেতে পারে, তবে কোনও অবজেক্ট টাইপের আক্ষরিক জন্য একটি টাইপ ওরফে টিএস 2.7 থেকে আর সত্য হতে পারে না
  • একটি ইন্টারফেসের একাধিক একত্রীকরণ ঘোষণাগুলি থাকতে পারে , তবে কোনও অবজেক্ট টাইপের আক্ষরিকরূপে একটি জাতীয় উপকরণ থাকতে পারে না।

109
"একাধিক একত্রীকরণ ঘোষণার" দ্বিতীয় পার্থক্যের অর্থ কী?
জারহালি

66
@ জ্রাহালি আপনি যদি ইন্টারফেসটি দু'বার সংজ্ঞায়িত করেন তবে টাইপস্ক্রিপ্ট এগুলিকে এক করে দেয়।
আন্দ্রে ফেদোরভ

39
@ জ্রাহালি যদি আপনি টাইপের সংজ্ঞা দুবার দেন তবে টাইপস্ক্রিপ্ট আপনাকে ত্রুটি দেয়
আন্দ্রে ফেদোরভ

18
@ জরাজহালিinterface Point { x: number; } interface Point { y: number; }
নাহুয়েল গ্রিকো

20
আমি বিশ্বাস করি প্রথম পয়েন্টটি extends or implementsআর হয় না। প্রকারটি দ্বারা প্রসারিত এবং প্রয়োগ করা যেতে পারে class। এখানে একটি উদাহরণ typescriptlang.org/play/...
dark_ruby

770

2019 আপডেট


বর্তমান উত্তর এবং অফিসিয়াল ডকুমেন্টেশনগুলি পুরানো। এবং টাইপস্ক্রিপ্টে নতুন এগুলির জন্য, ব্যবহৃত পরিভাষা উদাহরণ ছাড়াই পরিষ্কার হয় না। নীচে আপ-টু-ডেট পার্থক্যগুলির একটি তালিকা রয়েছে।

1. বিষয় / কার্যাদি

উভয়ই কোনও বস্তুর আকার বা কোনও ফাংশনের স্বাক্ষরের বর্ণনা দিতে ব্যবহার করা যেতে পারে। তবে বাক্য গঠন আলাদা হয়।

ইন্টারফেস

interface Point {
  x: number;
  y: number;
}

interface SetPoint {
  (x: number, y: number): void;
}

উপনাম টাইপ করুন

type Point = {
  x: number;
  y: number;
};

type SetPoint = (x: number, y: number) => void;

2. অন্যান্য প্রকার

কোনও ইন্টারফেসের বিপরীতে, প্রকারভেদটি অন্য প্রকারের যেমন আদিম, ইউনিয়ন এবং টিপলসের জন্যও ব্যবহার করা যেতে পারে।

// primitive
type Name = string;

// object
type PartialPointX = { x: number; };
type PartialPointY = { y: number; };

// union
type PartialPoint = PartialPointX | PartialPointY;

// tuple
type Data = [number, string];

3. প্রসারিত করুন

উভয় প্রসারিত করা যেতে পারে, কিন্তু আবার বাক্য গঠন আলাদা হয়। অতিরিক্তভাবে, নোট করুন যে একটি ইন্টারফেস এবং টাইপ উপন্যাস পারস্পরিক একচেটিয়া নয়। একটি ইন্টারফেস একটি প্রকারের উপন্যাস এবং বিপরীতভাবে প্রসারিত করতে পারে।

ইন্টারফেস ইন্টারফেস প্রসারিত

interface PartialPointX { x: number; }
interface Point extends PartialPointX { y: number; }

প্রকারের উপন্যাস প্রকারভেদ প্রসারিত করে

type PartialPointX = { x: number; };
type Point = PartialPointX & { y: number; };

ইন্টারফেস প্রকারের উপন্যাস প্রসারিত করে

type PartialPointX = { x: number; };
interface Point extends PartialPointX { y: number; }

প্রকারের উপন্যাস ইন্টারফেস প্রসারিত করে

interface PartialPointX { x: number; }
type Point = PartialPointX & { y: number; };

4. কার্যকর

একটি শ্রেণি একটি ইন্টারফেস প্রয়োগ করতে পারে বা উভয়কে একই সঠিক উপায়ে টাইপ করতে পারে। তবে নোট করুন যে কোনও শ্রেণি এবং ইন্টারফেস স্ট্যাটিক ব্লুপ্রিন্ট হিসাবে বিবেচিত হয়। অতএব, তারা কোনও ইউনিয়নের প্রকারের নাম দেয় এমন কোনও প্রকারের উপন্যাস প্রয়োগ করতে / প্রসারিত করতে পারে না।

interface Point {
  x: number;
  y: number;
}

class SomePoint implements Point {
  x = 1;
  y = 2;
}

type Point2 = {
  x: number;
  y: number;
};

class SomePoint2 implements Point2 {
  x = 1;
  y = 2;
}

type PartialPoint = { x: number; } | { y: number; };

// FIXME: can not implement a union type
class SomePartialPoint implements PartialPoint {
  x = 1;
  y = 2;
}

5. ঘোষণা মার্জ

কোনও প্রকারের উপন্যাসের বিপরীতে, একটি ইন্টারফেস একাধিকবার সংজ্ঞায়িত করা যায় এবং এটি একটি একক ইন্টারফেস হিসাবে বিবেচিত হবে (সমস্ত ঘোষণার সদস্যদের একত্রীকরণের সাথে)।

// These two declarations become:
// interface Point { x: number; y: number; }
interface Point { x: number; }
interface Point { y: number; }

const point: Point = { x: 1, y: 2 };

9
যদি অফিসিয়াল ডকুমেন্টেশনগুলি পুরানো হয় তবে আপনি যে তথ্য সরবরাহ করেছেন তা নিশ্চিত করা যাবে?
আইএক্স 3

59
এই পোস্টের উপর ভিত্তি করে, এটি মনে হয় যে কোনও প্রকারের উলের উপরে একটি ইন্টারফেস চয়ন করার একমাত্র কারণ হ'ল যদি আপনি ইন্টারফেসের ডিক্লারেশন মার্জিং (পয়েন্ট 5) বৈশিষ্ট্যটি ব্যবহার করতে চান। এর বাইরেও তারা সমতুল্য (এবং আমি যুক্তি দেব যে প্রকারের এলিয়াস আরও সংক্ষিপ্ত বাক্য গঠন দেয়)।
ম্যাক্সিডিসন

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

8
সুতরাং মূলত, এটি "প্রায় ব্যক্তিগত" পছন্দ যা আমরা ব্যবহার করতে সত্যই স্বাচ্ছন্দ্য বোধ করি? একটি কারণ ছাড়াও, আপনি কেবল ব্যবহার করতে পারেন typeবা interface? আমি কখনই এক বা অন্যটি ব্যবহার করব সে সম্পর্কে আমি এখনও বিভ্রান্ত।
জোসেফ ব্রিগেস

7
আপনি দয়া করে কেন ইন্টারফেস মার্জ করতে চান? এটি আমার কাছে সম্ভাব্য বিভ্রান্ত বলে মনে হচ্ছে। আপনি কেন আপনার ইন্টারফেসের সংজ্ঞাটি বিভিন্ন ব্লক জুড়ে ছড়িয়ে দিতে চান?
ভ্যানকুইশ 46

95

টাইপস্ক্রিপ্ট ৩.২ (নভেম্বর 2018) অনুসারে, নিম্নলিখিতটি সত্য:

এখানে চিত্র বর্ণনা লিখুন


9
আপনি যে টেবিল / চিত্রটি সরবরাহ করেছেন তা কীভাবে দয়া করে আরও তথ্য সরবরাহ করতে পারেন? উদাহরণস্বরূপ উত্স কোড বা ডকুমেন্টেশনের লিঙ্কগুলি
আইএক্স 3

23
হ্যাঁ, আমি সামগ্রীর উত্স বলতে চাইছি, উপস্থাপনা নয়।
আইএক্স 3

3
আমি বিশ্বাস করি না যে কোনও শ্রেণি একটি প্রকার বা ইন্টারফেস প্রসারিত করতে পারে এবং আপনি কেন চাইবেন তা আমি সত্যি দেখতে পারি না ??
ড্যান কিং কিং

7
পাঠ্যের চিত্র পোস্ট করা এড়িয়ে চলুন, পরিবর্তে প্রকৃত পাঠ্যটি সরাসরি আপনার পোস্টে অন্তর্ভুক্ত করুন। পাঠ্যের চিত্রগুলি সহজেই পার্সেবল বা সন্ধানযোগ্য নয় এবং দৃষ্টি প্রতিবন্ধী ব্যবহারকারীদের কাছে অ্যাক্সেসযোগ্য নয়।
অ্যান্ড্রু মার্শাল

2
এই টেবিলটিতে এর বিষয়বস্তুগুলি সমর্থন করার জন্য কোনও উত্সের অভাব রয়েছে এবং আমি এটির উপর নির্ভর করব না। উদাহরণস্বরূপ, আপনি typeনির্দিষ্ট সীমাবদ্ধতাগুলি ব্যবহার করে পুনরাবৃত্ত প্রকারগুলি সংজ্ঞায়িত করতে পারেন (এবং টাইপস্ক্রিপ্ট ৩.7 হিসাবে এই সীমাবদ্ধতাগুলি খুব বেশি চলে গেছে)। ইন্টারফেস প্রকার প্রসারিত করতে পারে। শ্রেণিগুলি প্রকারগুলি বাস্তবায়ন করতে পারে। তদ্ব্যতীত, কোনও টেবিলের স্ক্রিনশট হিসাবে ডেটা উপস্থাপিত করা প্রতিবন্ধী দৃষ্টিশক্তির জন্য একেবারেই অ্যাক্সেসযোগ্য করে তোলে।
মাইচা মিসজিজিজিন

22

https://www.typescriptlang.org/docs/handbook/advanced-types.html

একটি পার্থক্য হ'ল ইন্টারফেসগুলি একটি নতুন নাম তৈরি করে যা সর্বত্র ব্যবহৃত হয়। প্রকারের উপনাম একটি নতুন নাম তৈরি করে না - উদাহরণস্বরূপ, ত্রুটি বার্তাগুলি উপনামের নামটি ব্যবহার করবে না।


29
এটি এখন পুরানো এবং টাইপস্ক্রিপ্ট ২.১ থেকে আর সত্য নয়। দেখা. medium.com/@martin_hotell/...
demisx

5

প্রকার সহ উদাহরণ:

// কোনও বস্তুর জন্য একটি গাছের কাঠামো তৈরি করুন। ছেদ না হওয়ার কারণে (এবং) ইন্টারফেসের সাথে আপনি একই কাজ করতে পারবেন না

type Tree<T> = T & { parent: Tree<T> };

// কেবল কয়েকটি মান নির্ধারণের জন্য একটি পরিবর্তনশীলকে সীমাবদ্ধ করতে টাইপ করুন। ইন্টারফেসের ইউনিয়ন নেই (|)

type Choise = "A" | "B" | "C";

// প্রকারের জন্য ধন্যবাদ, আপনি শর্তাধীন ব্যবস্থার জন্য অমলযোগ্য প্রকারের ধন্যবাদ জানাতে পারেন।

type NonNullable<T> = T extends null | undefined ? never : T;

ইন্টারফেস সহ উদাহরণ:

// আপনি ওওপির জন্য ইন্টারফেস ব্যবহার করতে পারেন এবং অবজেক্ট / শ্রেণির কঙ্কাল সংজ্ঞায়িত করতে 'সরঞ্জামগুলি' ব্যবহার করতে পারেন

interface IUser {
    user: string;
    password: string;
    login: (user: string, password: string) => boolean;
}

class User implements IUser {
    user = "user1"
    password = "password1"

    login(user: string, password: string) {
        return (user == user && password == password)
    }
}

// আপনি অন্যান্য ইন্টারফেসের সাথে ইন্টারফেস প্রসারিত করতে পারেন

    interface IMyObject {
        label: string,
    }

    interface IMyObjectWithSize extends IMyObject{
        size?: number
    }

1

ইতিমধ্যে সরবরাহ করা উজ্জ্বল উত্তরগুলির পাশাপাশি, ইন্টারফেস বনাম প্রকার প্রসারিত করার ক্ষেত্রে এখানে লক্ষণীয় পার্থক্য রয়েছে । আমি সম্প্রতি এমন বেশ কয়েকটি কেস নিয়েছি যেখানে একটি ইন্টারফেস কাজটি করতে পারে না:

  1. একটি ইন্টারফেস ব্যবহার করে ইউনিয়নের ধরণ বাড়ানো যায় না
  2. জেনেরিক ইন্টারফেস বাড়ানো যায় না

-2

ডকুমেন্টেশন ব্যাখ্যা করেছে

  • একটি পার্থক্য হ'ল ইন্টারফেসগুলি একটি নতুন নাম তৈরি করে যা সর্বত্র ব্যবহৃত হয়। টাইপ অ্যালিয়াস একটি নতুন নাম তৈরি করে না - উদাহরণস্বরূপ, ত্রুটি বার্তাগুলি টাইপস্ক্রিপ্টের পুরানো সংস্করণ নাম নেম। সংস্করণ ২.7 অনুসারে, নতুন চৌরাস্তা প্রকার তৈরি করে প্রকারের উপকরণগুলি বাড়ানো যেতে পারে
  • অন্যদিকে, আপনি যদি কোনও ইন্টারফেস দিয়ে কিছু আকৃতি প্রকাশ করতে না পারেন এবং আপনাকে ইউনিয়ন বা টুপল টাইপ ব্যবহার করা দরকার, টাইপ এলিয়াসগুলি সাধারণত যাওয়ার উপায়।

ইন্টারফেস বনাম প্রকারের নাম

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