2016-06-27 4 views
4

Я пытаюсь расширить объект данных в TypeScript, добавив несколько новых полей. Хотя я предполагаю, что это довольно распространенный шаблон в JavaScript, я не могу его скомпилировать, не делая bar как необязательный в фрагменте, как показано ниже.Расширение объекта данных в TypeScript

Мне интересно, есть ли способ избежать bar опционально. Любое предложение приветствуется, спасибо.

interface BaseDataObject { 
    foo: string; 
} 

interface ExtendedDataObject extends BaseDataObject { 
    bar?: string; 
} 

function extendData(input : BaseDataObject) : ExtendedDataObject { 
    var output : ExtendedDataObject = input; 
    output.bar = input.foo + ' some suffix'; 
    return output; 
} 

ответ

4

Вы можете сделать это во время компиляции литья input для ExtendedDataObject вместо того, чтобы просто присвоив его output:

interface ExtendedDataObject extends BaseDataObject { 
    bar: string; 
} 

function extendData(input : BaseDataObject) : ExtendedDataObject { 
    var output = input as ExtendedDataObject; 
    output.bar = input.foo + ' some suffix'; 
    return output; 
} 

Этот тип броска официально называется type assertion и он говорит компилятору доверять вам что объект можно рассматривать как тип, который вы указываете.

+0

Кажется, что это единственный способ избежать этого. – choz

+0

Это работает, спасибо. И я предполагаю, что проверка времени компиляции отсутствующих полей обходит, не так ли? – Haocheng

+1

@Haocheng Правильно, это официально называется [утверждение типа] (https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html), и он сообщает компилятору, что вы доверяете ему, что объект может рассматриваться как тип, который вы указываете. – JohnnyHK

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