2015-09-07 3 views
0

Скажем, у меня есть код вдоль линий этого:Устранение типа неоднозначность в машинописном

function defaultIt(s: MaybeString): string { 
    if (typeof s.content === "string") { 
    return s.content; 
    } 

    return ""; 
} 

class MaybeString { 
    content: string|void; 
} 

Поправьте меня, если я ошибаюсь, но я считаю, что это о том, как тип безопасной, как вы можете получить; любой возможный ввод, который соответствует MaybeString, приведет к строке. Тем не менее, TypeScript дает мне ошибку: Type 'string | void' is not assignable to type 'string'.

Как заставить TypeScript распознавать, что я удалил неоднозначность, проверив тип?

Спасибо!

+0

По общему признанию, я использовал только дескриптор в течение нескольких месяцев, но имеет ли смысл вводить 'content' как' string | void'? Правильно ли это «тип объединения»? Итак, что вы говорите, делая это, свойство 'content' ONLY имеет свойства, которые являются общими для' string' и 'void' (и поскольку' void' вообще не имеет свойств, 'string | void' в основном является то же самое, что и 'void'). Вы пытаетесь сказать, что свойство content является необязательным и может не иметь значения? –

+0

Полагаю, я неправильно понял. Я думал, что это похоже на нечто вроде «Maybe». Есть ли способ сказать, что это может быть * или * строка или пустота? –

+0

Я удалил свой ответ b/c, это было о дополнительных свойствах на интерфейсах. Но в основном вам не нужно делать ничего особенного (в отношении деклараций типов), если свойство класса необязательно. Это был вывод, к которому я пришел после того, как вы указали мою ошибку, и это подкреплено [этим ответом] (http://stackoverflow.com/a/18916914/398606). –

ответ

1

В настоящее время вы можете использовать дополнительную переменную:

var temp:string|void = s.content; 

if (typeof temp === "string") { 
    return temp; 
} 

sample

Или бросить в строку:

if (typeof s.content === "string") { 
    return <string>s.content; 
} 

sample

Для классов, которые вы можете использовать instanceOf функцию, см this article для получения более подробной информации

+0

Немного странно, что вы можете это сделать, на самом деле, учитывая, что 's.content' уже имеет тип' string | void' –

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