निम्नलिखित में क्या अंतर हैं?
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
निम्नलिखित में क्या अंतर हैं?
type Foo = {
foo: string
};
interface Foo {
foo: string;
}
जवाबों:
इंटरफेस बढ़ाया जा सकता है
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;
इसलिए सामान्य तौर पर अगर आपके पास एक सादा वस्तु प्रकार है, जैसा कि आपके प्रश्न में दिखाया गया है, तो एक इंटरफ़ेस आमतौर पर एक बेहतर दृष्टिकोण होता है। यदि आप अपने आप को कुछ ऐसा लिखना चाहते हैं जो एक इंटरफ़ेस के रूप में नहीं लिखा जा सकता है, या बस कुछ अलग नाम देना चाहते हैं, तो एक प्रकार का उपनाम बेहतर है।
Type aliases, however, can represent some things interfaces can'tयह मेरे लिए अपने उदाहरण लगता है NeatAndCoolऔर JustSomeOtherNameअंतरफलक है कि मौजूदा विस्तार के रूप में बनाया जा सकता है Neat, Coolया SomeTypeप्रकार।
interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
साथ ही, एक इंटरफ़ेस लागू किया जा सकता है ।
class Thing implements Neat, Cool
प्रकार इंटरफेसेस की तरह थोड़े हैं और इसके विपरीत: दोनों एक वर्ग द्वारा लागू किया जा सकता है। लेकिन कुछ महत्वपूर्ण अंतर हैं: 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'
}
इन दोनों के बीच अंतर पहले से ही इस धागे में हैं।
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में एक चर की संभावित संरचना या मूल्य का वर्णन करता है।
यह कहना गलत है कि "इंटरफेस को लागू किया जा सकता है" क्योंकि प्रकार भी लागू किए जा सकते हैं
type A = { a: string };
class Test implements A {
a: string;
}
यद्यपि आप ऐसा कर सकते हैं, आप एक प्रकार को लागू नहीं कर सकते हैं जो एक प्रकार का संघ है, जो पूरी तरह से ईमानदारी से समझ में आता है :)
टाइपस्क्रिप्ट का प्रकार पहले से मौजूद प्रकारों को संदर्भित करने के लिए उपयोग किया जाता है । इसे बढ़ाया नहीं जा सकता 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
}