2015-03-03 11 views
5

टाइपप्रति 1.4 मैं निम्नलिखित कोड तर्ज पर अजीब त्रुटियों हो रही है के साथ कार्य करना:टाइपप्रति संकलन तारीख प्रकार की त्रुटि

var dateFrom:Date; 
var dateTo:Date; 
if(typeof discount.dateFrom === "string"){ 
    dateFrom = new Date(discount.dateFrom); // Line 362 
} else { 
    dateFrom = discount.dateFrom; 
} 

if(typeof discount.dateTo === "string"){ 
    dateTo = new Date(<string>discount.dateTo); // Line 368 
} else { 
    dateTo = discount.dateTo; 
} 

transpiler रिटर्न निम्नलिखित:

[FULL_PATH]/Quotation.ts(362,37): error TS2345: Argument of type 'Date' is not assignable to parameter of type 'string'. 
[FULL_PATH]/Quotation.ts(368,35): error TS2352: Neither type 'Date' nor type 'string' is assignable to the other. 

लाइन 362 से अंतर और 368 दो मामले हैं जिन्हें मैंने इस मुद्दे को ठीक करने की कोशिश की।

मैंने कोड में दूसरी जगह इस गूढ़ का उपयोग किया, और यह ठीक काम किया।

मैं संदर्भ के लिए lib.d.ts से दिनांक निर्माता की परिभाषा शामिल कर रहा हूँ: date से string के लिए जाना जाता कनवर्टर @danludwig को

new(): Date; 
new (value: number): Date; 
new (value: string): Date; 
new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date; 
(): string; 
+0

पंक्ति # 362 में त्रुटि स्पष्ट प्रतीत होती है ... कन्स्ट्रक्टर तर्क 'स्ट्रिंग' या 'संख्या' की अपेक्षा करता है, लेकिन आप इसे एक और तारीख' पास कर रहे हैं। जब तक 'discount.dateFrom' शीर्ष पर घोषित चर के समान नहीं है? – danludwig

+0

@danludwig मुझे लगता है कि लाइन 368 को समस्या को हल करना चाहिए –

+0

लाइन # 368 के साथ समस्या यह है कि 'date' से' string' तक कोई ज्ञात रूपांतरण नहीं है। यह टाइपस्क्रिप्ट की तरह है जो आपको बता रहा है कि एक अवैध कलाकार है। यदि 'string.dateFrom' या' discount.dateTo' के रनटाइम प्रकार के लिए 'स्ट्रिंग' होने के लिए यह संभव है, तो आपको उन्हें 'दिनांक' के बजाय' किसी भी 'के रूप में घोषित करना चाहिए। – danludwig

उत्तर

2

है मान लें कि discount.dateFrom एक संघ प्रकार है जैसे कि string|Date, ऐसा लगता है कि आप एक ऑब्जेक्ट की संपत्ति पर एक प्रकार के गार्ड का उपयोग करने की कोशिश कर रहे हैं, न कि एक स्थानीय स्थानीय चर पर। यही कारण है कि समर्थित नहीं:

if (typeof discount.dateFrom === "string") { 
    // This doesn't change the type of discount.dateFrom 
} 

हालांकि, अगर आप लिखें:

var dateFromProp = discount.dateFrom; 
if (typeof dateFromProp === "string") { 
    // dateFromProp is a string in this scope 
} 

फिर काम करना चाहिए।

+0

दिलचस्प, मुझे नहीं पता था कि आप ऐसा कर सकते हैं। तो क्या यह एक "संघ प्रकार" है? 'dateFromProp' को' discount.dateFrom' के प्रकार से अनुमानित नहीं किया गया है? टीएस के किस संस्करण ने यूनियन प्रकार की शुरुआत की, या क्या वे वहां सब छुपा रहे हैं? – danludwig

+2

@ डनलुडविग यूनियन टाइप 1.4 में पेश किया गया http://blogs.msdn.com/b/typescript/archive/2014/11/18/what-s-new-in-the-typescript-type-system.aspx –

0

धन्यवाद .toString()

if(typeof discount.dateTo === "string"){ 
    dateTo = new Date(discount.dateTo.toString()); 
} else { 
    dateTo = discount.dateTo; 
} 
+0

इसके साथ समस्या यह है कि 'typeof discount.dateTo ===' string'', आपको उस पर '.toString()' कॉल नहीं करना चाहिए। यदि 'discount.dateTo' के लिए 'स्ट्रिंग' या' दिनांक' होना संभव है, तो इसे 'किसी भी' के रूप में घोषित किया जाना चाहिए। – danludwig

+0

@ डनलुडविग - या एक यूनियन प्रकार, जिस स्थिति में ओपी का कोड 'किसी भी' का उपयोग किये बिना पूरी तरह से टाइप किए जाने के लिए तय किया जा सकता है। –

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