टाइपस्क्रिप्ट में, प्रकार और इंटरफ़ेस में क्या अंतर है?


114

निम्नलिखित में क्या अंतर हैं?

type Foo = { 
    foo: string 
};
interface Foo {
   foo: string;
}

3
प्रकार को इंटरफ़ेस एक्सटेंशन की तरह बढ़ाया नहीं जा सकता है। प्रकार केवल एक प्रकार के लिए उपनाम हैं।
पीएसएल

4
यहां उपलब्ध मार्गदर्शन: basarat.gitbooks.io/typescript/content/docs/types/…
basarat

2
मैं ज्यादातर बाहरी डेटा के लिए टाइप का उपयोग करता हूं, उदाहरण के लिए JSON फ़ाइल से, या यदि आप केवल OOP कक्षाओं का उपयोग किए बिना फ़ंक्शन लिख रहे हैं।
कोकोडोको

1
मुझे यह लेख उपयोगी लगा जो मतभेदों की व्याख्या करता है - मध्यम.
संदीप जीबी

1
स्वीकृत उत्तर पुराना है। यहां पोस्ट की गई अपडेट व्याख्या (चूंकि वह धागा Google द्वारा पसंद किया गया है): stackoverflow.com/questions/37233735/…
jabacchetta

जवाबों:


125

इंटरफेस बढ़ाया जा सकता है

interface A {
  x: number;
}
interface B extends A {
  y: string;
}

और संवर्धित भी

interface C {
  m: boolean;
}
// ... later ...
interface C {
  n: number;
}

हालांकि, एलियास टाइप कुछ चीजों का प्रतिनिधित्व कर सकते हैं, जो इंटरफेस नहीं कर सकते हैं

type NumOrStr = number | string;
type NeatAndCool = Neat & Cool;
type JustSomeOtherName = SomeType;

इसलिए सामान्य तौर पर अगर आपके पास एक सादा वस्तु प्रकार है, जैसा कि आपके प्रश्न में दिखाया गया है, तो एक इंटरफ़ेस आमतौर पर एक बेहतर दृष्टिकोण होता है। यदि आप अपने आप को कुछ ऐसा लिखना चाहते हैं जो एक इंटरफ़ेस के रूप में नहीं लिखा जा सकता है, या बस कुछ अलग नाम देना चाहते हैं, तो एक प्रकार का उपनाम बेहतर है।


3
Type aliases, however, can represent some things interfaces can'tयह मेरे लिए अपने उदाहरण लगता है NeatAndCoolऔर JustSomeOtherNameअंतरफलक है कि मौजूदा विस्तार के रूप में बनाया जा सकता है Neat, Coolया SomeTypeप्रकार।
रुडी

वास्तव में दूसरा और तीसरा उदाहरण एक इंटरफेस के साथ बनाया जा सकता है:interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
पीटरज़वेस्ट

3
दो इंटरफेसों का विस्तार हमेशा एक चौराहे के प्रकार के रूप में एक ही परिणाम नहीं देगा, और सभी प्रकारों को बढ़ाया नहीं जा सकता है (जबकि सभी प्रकारों को अलग किया जा सकता है या यूनियनों / चौराहों में डाला जा सकता है)
रयान कैवानुआग

1
तो प्रकार का लाभ क्या है? क्या हम कह सकते हैं कि जब हमारे पास इंटरफ़ेस है, तो प्रकार उपयोगी नहीं है?
मुस्तफा सादतनिया

4

साथ ही, एक इंटरफ़ेस लागू किया जा सकता है


1
और एक ऑब्जेक्ट कई इंटरफेस को लागू कर सकता हैclass Thing implements Neat, Cool
कोकोडोको

1
आपके कहने का क्या मतलब है ? टाइप बी भी लागू किया जा सकता है
nad

3
यह एक टिप्पणी होना चाहिए एक जवाब नहीं imo।
माइकल कुन्स्ट

प्रिय डेव, आपको एक टिप्पणी छोड़नी चाहिए, एक उत्तर नहीं। इस उत्तर के आधार पर आपका उत्तर बिल्कुल सही नहीं है।
मेहरदादश

4

प्रकार इंटरफेसेस की तरह थोड़े हैं और इसके विपरीत: दोनों एक वर्ग द्वारा लागू किया जा सकता है। लेकिन कुछ महत्वपूर्ण अंतर हैं: 1. जब टाइप एक वर्ग द्वारा कार्यान्वित किया जाता है, तो जो गुण टाइप के होते हैं उन्हें वर्ग के अंदर आरंभीकृत किया जाना चाहिए, जबकि इंटरफ़ेस के साथ उन्हें घोषित किया जाना चाहिए। 2. जैसा कि @ आर्यन ने उल्लेख किया है: इंटरफ़ेस एक और इंटरफ़ेस का विस्तार कर सकता है। प्रकार नहीं कर सकते।

type Person = {
    name:string;
    age:number;
}

// must initialize all props - unlike interface
class Manager implements Person {
    name: string = 'John';
    age: number = 55;

    // can add props and methods
    size:string = 'm';
}

const jane : Person = {
    name :'Jane',
    age:46,

    // cannot add more proprs or methods
    //size:'s'
}

4

इन दोनों के बीच अंतर पहले से ही इस धागे में हैं।

type Foo = {
    foo: string
};
interface Foo {
    foo: string;
}

यहाँ type Fooऔर interface Fooलगभग समान है तो यह भ्रामक है।

interfaceअनुबंध है कि निम्नलिखित गुण (यहां foo:string) एक वस्तु में होना चाहिए। interfaceनहीं है class। इसका उपयोग तब किया जाता है जब भाषा मल्टीपल इनहेरिटेंस का समर्थन नहीं करती है। तो interfaceविभिन्न वर्गों के बीच एक आम संरचना हो सकती है।

class Bar implements Foo {
    foo: string;
}

let p: Foo = { foo: 'a string' };

लेकिन typeऔर interfaceबहुत अलग संदर्भ में उपयोग किया जाता है।

let foo: Foo;
let today: Date = new Date();

यहाँ typeकी fooहै Fooऔर todayहै Date। इसकी एक चर घोषणा की तरह है जो टाइपोफ अन्य चर की जानकारी रखती है। typeइंटरफेस, कक्षाएं, फ़ंक्शन हस्ताक्षर, अन्य प्रकार या यहां तक ​​कि मान (जैसे type mood = 'Good' | 'Bad') के सुपरसेट की तरह है । अंत typeमें एक चर की संभावित संरचना या मूल्य का वर्णन करता है।


4

यह कहना गलत है कि "इंटरफेस को लागू किया जा सकता है" क्योंकि प्रकार भी लागू किए जा सकते हैं

type A = { a: string };


class Test implements A {

    a: string;
}

यद्यपि आप ऐसा कर सकते हैं, आप एक प्रकार को लागू नहीं कर सकते हैं जो एक प्रकार का संघ है, जो पूरी तरह से ईमानदारी से समझ में आता है :)


4

टाइपस्क्रिप्ट का प्रकार पहले से मौजूद प्रकारों को संदर्भित करने के लिए उपयोग किया जाता है । इसे बढ़ाया नहीं जा सकता interface। इस प्रकार typeहैं:

type Money = number;
type FormElem = React.FormEvent<HTMLFormElement>;
type Person = [string, number, number];

आप रेस्ट और स्प्रेड का उपयोग प्रकारों में कर सकते हैं:

type Scores = [string, ...number[]];
let ganeshScore = ["Ganesh", 10, 20, 30]
let binodScore = ["Binod", 10, 20, 30, 40]

दूसरी ओर, इंटरफ़ेस आपको एक नया प्रकार बनाने की अनुमति देता है।

interface Person{
  name: string,
  age: number, 
}

Interface can be extended with extends keyword.
interface Todo{
  text: string;
  complete: boolean;
}

type Tags = [string, string, string]

interface TaggedTodo extends Todo{
 tags: Tags
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.