टाइपस्क्रिप्ट एक इंटरफ़ेस या एक प्रकार को रिकॉर्ड करने के लिए असाइन करें <string, string>

Nov 23 2020

इस प्रश्न या इस लेख को पढ़ने के बाद , मैं अभी भी एक interfaceऔर के बीच सूक्ष्म अंतर के बारे में थोड़ा उलझन में हूं type

इस उदाहरण में, मेरा लक्ष्य एक व्यापक Record<string, string>प्रकार के लिए एक साधारण वस्तु प्रदान करना है :

interface MyInterface {
  foobar: string;
}

type MyType = {
  foobar: string;
}

const exampleInterface: MyInterface = { foobar: 'hello world' };
const exampleType: MyType = { foobar: 'hello world' };

let record: Record<string, string> = {};

record = exampleType;      // Compiles
record = exampleInterface; // Index signature is missing

कोशिश करो

असाइनमेंट तब संभव है जब मेरी ऑब्जेक्ट को ए के साथ घोषित किया जाता है type, लेकिन ए के साथ इसी तरह की घोषणा करते समय नहीं interface। इसमें कहा गया है कि इंडेक्स सिग्नेचर गायब है, लेकिन इंडेक्स हस्ताक्षरों की मेरी (सीमित) समझ के लिए, इनमें से कोई भी MyTypeऔर MyInterfaceवास्तव में एक नहीं है।

क्या कारण है कि पिछली पंक्ति संकलित नहीं करती है जबकि पिछले एक करता है?

जवाब

2 ddprrt Nov 23 2020 at 21:51

Record<string, string>के रूप में ही है { [key: string]: string }। एक उपसमुच्चय को इस सूचकांक हस्ताक्षर प्रकार को सौंपा जाने की अनुमति है केवल तभी संभव है जब उस प्रकार के सभी गुणों को जाना जाता है और इस सूचकांक हस्ताक्षर के खिलाफ जांच की जा सकती है। आपके मामले में, से सब कुछ exampleTypeकरने योग्य है Record<string, string>। यह केवल ऑब्जेक्ट शाब्दिक प्रकारों के लिए जांचा जा सकता है, क्योंकि वस्तु शाब्दिक प्रकारों को आपके द्वारा घोषित किए जाने के बाद नहीं बदला जा सकता है। इस प्रकार, सूचकांक हस्ताक्षर ज्ञात है।

स्रोत: https://github.com/microsoft/TypeScript/pull/7029

इसके विपरीत, इंटरफेस अंतिम नहीं हैं जब आप उन्हें घोषित करते हैं। घोषणा विलय के कारण एक ही इंटरफ़ेस में नए सदस्यों को जोड़ने की संभावना हमेशा होती है।