2015-12-30 4 views
2

Я пытаюсь создать словарь в TypeScript, где каждый элемент в словаре имеет тип класса.ТипScript создает словарь типа

interface Methods { 
    [index: string]: MethodRep; 
} 

export class MethodRep { 
    name: string; 
} 

export class BaseFileStructure { 
    public methods: Methods; 

    constructor() { 
     this.methods = {}; 
    } 
} 

, но это, похоже, не нравится. Я использую атом с подключением TypeScript. он говорит Compile failed but emit succeeded.

Если изменить тип элементов в строке, то он работает (даже положить номер типа не работает)

interface Methods { 
    [index: string]: string; // only this works 
} 

, что я здесь отсутствует?

+2

Детская площадка (http://www.typescriptlang.org/Playground) не содержит ошибок для вашего кода. – TSV

+0

Вы пытались изменить класс MethodRep на интерфейс? – Guillaume

+0

Согласен с @Guillaume Я только когда-либо получал это, чтобы работать с интерфейсами – gsobocinski

ответ

0

Вы можете попробовать с заменой MethodRep класса на интерфейс, как это:

interface Methods { 
    [index: string]: MethodRep; 
} 

export interface MethodRep { 
    name: string; 
} 

export class BaseFileStructure { 
    public methods: Methods; 

    constructor() { 
     this.methods = {}; 
    } 
} 
1

Поскольку interface Methods не экспортируется, но вы используете его как часть класса, который является экспортируемой, если ваш компилятор созданный для создания файлов декларации (d.ts) (и возможно, что используемый вами плагин всегда делает это за кулисами и управляет написанием этих файлов), TypeScript будет жаловаться на то, что методы интерфейса не экспортируются, поскольку на него ссылаются общедоступный член:

ошибка TS4031: общедоступные свойства «методов» экспортируемого класса имеют или используют личное имя «Методы».

Если изменить interface Methods к export interface Methods, это должно решить проблему, так как не существует в противном случае никаких проблем с вашим кодом.

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