2015-03-03 20 views
5

:typescript derleme tarih türü hatası

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 döndürür aşağıdaki:

[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. 

hattı 362 den farkı ve 368, sorunu düzeltmeye çalıştığım iki durum.

Bu gimmiği koddaki başka bir yerde kullandım ve iyi çalıştı. Ben referans için lib.d.ts gelen tarihi yapıcı tanımını içeren ediyorum

: date den string bilinen çevirici @danludwig için

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 numaralı satırdaki hata açıkça görünüyor ... kurucu argümanı bir "dize" veya bir "sayı" bekliyor, ancak başka bir "Tarih" geçiyorsunuz. 'Discount.dateFrom', üstte bildirilen değişkenle aynı değilse? – danludwig

+0

@danludwig Sanırım hat 368 sorunu düzeltmek gerekiyordu –

+0

Hat # 368 ile ilgili problem, 'Date' den' string''ye bilinen bir dönüşüm olmamasıdır. Bu, geçersiz bir yayın olduğunu söyleyen yazılara benziyor. 'Discount.dateFrom' veya 'discount.dateTo' dize' olması için çalışma zamanı türünün mümkün olması durumunda, bunları 'Tarih' yerine "herhangi bir" olarak bildirmeniz gerekir. – danludwig

cevap

2

olduğunu discount.dateFrom, string|Date gibi bir birleştirme türü olduğu varsayılırsa, düz bir yerel değişkende değil, bir nesnenin özelliği üzerinde bir tür koruma kullanmaya çalıştığınız anlaşılıyor. Yani desteklenmeyen:

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

Ancak, yazarsanız:

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

Sonra çalışmalıdır.

+0

İlginç, Bunu yapabileceğinizi bilmiyordum. Yani bu bir "sendika tipi" mi? 'dateFromProp' türünü 'discount.dateFrom' türünden türetilmiş almaz? TS'nin hangi sürümü sendika türlerini tanıttı, ya da orada saklandı mı? – danludwig

+2

@danludwig'in birleşim türü, 1.4 http://blogs.msdn.com/b/typescript/archive/2014/11/18/what-s-new-in-the-typescript-type-system.aspx adresinde tanıtıldı. –

0

teşekkür .toString()

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

Sorun şu ki, 'typeof discount.dateTo ===' string 'ise, '.toString()' işlevini çağırmanız gerekmemelidir. 'String' veya 'Tarih 'olmak için discount.dateTo' için mümkün ise, o zaman' any' olarak bildirilmelidir. – danludwig

+0

@danludwig - veya bir sendika tipi, bu durumda OP'nin kodu, herhangi birine başvurmadan tam olarak statik olarak yazılacak şekilde düzeltilebilir. –