2015-03-03 2 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 - это два случая, когда я пытался исправить проблему.

Я использовал этот gimmic в другом месте в коде, и он работал нормально.

я в том числе определение конструктора Date из lib.d.ts для справки:

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 кажется очевидной ... аргумент конструктора ожидает 'string' или' number', но вы передаете ему еще одну 'Date'. Если 'discount.dateFrom' не совпадает с переменной, указанной в верхней части? – danludwig

+0

@danludwig Я предполагаю, что строка 368 должна исправить проблему –

+0

Проблема с строкой # 368 заключается в том, что неизвестного преобразования из 'Date' в' string' нет. Это похоже на машинописный текст, говорящий вам, что это недопустимый литой. Если для типа времени выполнения 'discount.dateFrom' или' discount.dateTo' можно использовать тип runtime, то вы должны объявить их как 'any', а не' Date'. – 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'? Какая версия TS вводила типы профсоюзов, или они скрывались там все время? – danludwig

+2

@ danludwig тип объединения появился в 1.4 http://blogs.msdn.com/b/typescript/archive/2014/11/18/what-s-new-in-the-typescript-type-system.aspx –

0

Благодаря @danludwig известный конвертора от date к string является .toString()

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

Проблема с этим заключается в том, что 'typeof discount.dateTo === 'string'', вам не нужно вызывать' .toString() 'на нем. Если возможно, что 'discount.dateTo' будет либо' string', либо 'Date', тогда он должен быть объявлен как' any'. – danludwig

+0

@danludwig - или тип объединения, и в этом случае код OP может быть зафиксирован, чтобы быть полностью статически введенным, не прибегая к 'any'. –

Смежные вопросы