2016-01-15 10 views
5

क्या यह 2 टाइपप्रति कोड के बीच अंतर? (मैं टाइपप्रति 1.7.5 का उपयोग)इस 2 टाइपस्क्रिप्ट कोड के बीच क्या अंतर है?

interface SquareConfig { 
    color?: string; 
    width?: number; 
} 

function createSquare(config: SquareConfig): {color: string; area: number} { 
    var newSquare = {color: "white", area: 100}; 
    if (config.color) { 
    newSquare.color = config.color; 
    } 
    if (config.width) { 
    newSquare.area = config.width * config.width; 
    } 
    return newSquare; 
} 

var obj = {color1: "black"}; 
var mySquare = createSquare(obj); 

है जब त्रुटि नहीं संकलन लेकिन कोड उत्पादन त्रुटि के नीचे है।

interface SquareConfig { 
    color?: string; 
    width?: number; 
} 

function createSquare(config: SquareConfig): {color: string; area: number} { 
    var newSquare = {color: "white", area: 100}; 
    if (config.color) { 
    newSquare.color = config.color; 
    } 
    if (config.width) { 
    newSquare.area = config.width * config.width; 
    } 
    return newSquare; 
} 

var mySquare = createSquare({color1: "black"}); 

त्रुटि:

test.ts(18,30): error TS2345: Argument of type '{ color1: string; }' is not assignable to parameter of type 'SquareConfig'. Object literal may only specify known properties, and 'color1' does not exist in type 'SquareConfig'.

+0

'रंग 1' से' रंग' का नाम बदलें? –

उत्तर

1
अपने उदाहरण के

दोनों एक ही (कथित) त्रुटि है, जो यह है कि आप एक संपत्ति है कि SquareConfig के लिए नहीं जाना है, जो अक्सर गलत आप का मतलब है निर्दिष्ट किया है एक संपत्ति का नाम टाइप किया।

आपके मामले में आपने color1 निर्दिष्ट किया है जहां आप शायद color का उपयोग करना चाहते हैं।

यह कोड टाइपस्क्रिप्ट के पुराने संस्करणों का उपयोग करके संकलित किया गया था इससे पहले कि निर्दिष्ट निर्दिष्ट गुणों की जांच करने की इस अतिरिक्त सुविधा को जोड़ा गया था।

ठीक करता है ...

विकल्प एक, सही संपत्ति निर्दिष्ट करें:

var mySquare = createSquare({color: "black"}); 

विकल्प दो, आप जानबूझकर कुछ अन्य संपत्ति को शामिल करने के लिए इच्छुक हैं, एक प्रकार दावे का उपयोग संकलक क्या आप जानते हैं बताने के लिए बेहतर यह होता है (जब तक आप आप वास्तव में बेहतर यह होता है पता यकीन है कि कर रहे हैं!): टिप्पणी ०१२३५१६४१० के आधार पर

var mySquare = createSquare(<SquareConfig>{color1: "black"}); 

अद्यतन

संकलक अधिक सख्त आपके पास कम "जुदाई की डिग्री" ... उदाहरण के लिए है:

// Error 
var obj: SquareConfig = {color1: "black"}; 

// OK 
var obj = {color1: "black"}; 
var obj2: SquareConfig = obj; 

का पहला उदाहरण देखते हैं, हम कह रहे हैं, "मैं बनाने का इरादा एक SquareConfig"। कंपाइलर कहता है, "ठीक है, आइटम की आवश्यकता नहीं है क्योंकि सब कुछ वैकल्पिक है, लेकिन आप उस संपत्ति के साथ ऑब्जेक्ट बना रहे हैं जिसे मैं पहचान नहीं पा रहा हूं - इसलिए मैं आपको चेतावनी दूंगा"।

दूसरा उदाहरण थोड़ा अलग है। हम कह रहे हैं "मैं उस ऑब्जेक्ट का उपयोग करना चाहता हूं जो मेरे पास SquareConfig" है। कंपाइलर कहता है, "क्या आप जिस वस्तु का उपयोग करना चाहते हैं वह किसी भी आवश्यक गुणों को याद करने का इरादा रखता है ... और क्या प्रत्येक संपत्ति के पास SquareConfig - हाँ के लिए संरचनात्मक मिलान होने का सही प्रकार है।"

यदि दूसरे परिदृश्य ने उन गुणों के बारे में आपको चेतावनी दी जो लक्ष्य संरचना पर मौजूद नहीं हैं, तो आप एक संरचनात्मक प्रकार प्रणाली प्रदान करने वाले उबेर-पॉलिमॉर्फिज्म का लाभ नहीं ले पाएंगे।

+0

यदि 1 कोड बदलता है, तो कृपया समीक्षा करें। टैंक –

संबंधित मुद्दे