2016-09-02 10 views
-2

Я пытаюсь выяснить, как получить один экземпляр интерфейса в TypScript. У меня есть следующий код, который работает:Как получить один экземпляр интерфейса в Typcript

export interface IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 

openStatus: IOpenStatus[]; 

Однако, если я хочу только один экземпляр интерфейса должны быть определены, это терпит неудачу:

openStatus: IOpenStatus; 

Это терпит неудачу, а также:

let openStatus= new IOpenStatus(); 

Кажется, что массив «[]» каким-то образом заменяет механизм создания экземпляра (хотя и для нескольких экземпляров). В моей ситуации я никогда не хочу создавать экземпляр более одного экземпляра интерфейса.

Как создать экземпляр одного экземпляра интерфейса? Мне нужно использовать интерфейс, потому что я собираюсь вернуть эти данные с сервера с помощью этого же интерфейса.

UPDATE Я вижу, что часть проблемы была не указана в контексте. Я делаю это в приложении Angular2. В моей ситуации, я использовал

openStatus: IOpenStatus[];

как часть определения класса собственности (компонент, чтобы быть точным). Кажется, что нотация массива просто позволяет Javascript предвидеть создание массива типа интерфейса без какого-либо дальнейшего определения (его можно использовать как массив такого, сразу после этого).

Что я должен сделать, в конце концов использовать:

userOpenStatus = new OpenStatus();

является реализация интерфейса в классе, таких как:

export interface IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 

export class OpenStatus implements IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 
+0

Вы не можете создать интерфейс. Они существуют, чтобы иметь контракт без реализации, поэтому копирование противоречит всей причине, по которой они существуют. – ssube

+0

ok, так что если это так, то как это 'openStatus: IOpenStatus [];' ** делает ** реализует массив интерфейса? –

+0

'IOpenStatus []' просто объявляет 'openStatus', чтобы в конечном итоге содержать массив' IOpenStatus', он не реализует и не создает никаких экземпляров. – ssube

ответ

2

Дано:

export interface IOpenStatus { 
    filePath: string; 
    openSuccess: boolean; 
    error: string; 
    fileData: string; 
} 

Это само по себе является синтаксической ошибкой:

openStatus: IOpenStatus[]; 

(Хотя это было бы справедливо, как объявление класса собственности.) Вам может понадобиться что-то вроде:

let openStatus: IOpenStatus[]; 

Это в точности соответствует обычной версии JS:

let openStatus; 

только Разница - это аннотация типа. Если вы не хотите, чтобы это было массив вашего типа, просто сказать:

let openStatus: IOpenStatus; 

Для того, чтобы появиться после new ключевого слова, идентификатор должен быть именем функции конструктора, и самый простой способ объявите одно из них с ключевым словом class.Но вы могли бы просто использовать тип литерала:

openStatus = { 
    filePath: "/blah", 
    openSuccess: true, 
    error: "", 
    fileData: "Hello, world." 
}; 

Это имеет все свойства, необходимые для IOpenStatus, поэтому он может быть назначен переменной этого типа.

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

  • Нет связанных вопросов^_^