2016-07-11 2 views
0

Я новичок в TypeScript, и у меня возникают проблемы с базовым классом.Ошибка создания экземпляра класса TypScript (ошибка не конструктора)

У меня есть пространство имен RecordsService с классом Запись, объявленная внутри нее. Я хочу иметь возможность создавать записи в RecordsService, а затем обращаться к ним с помощью общедоступных методов из других методов и т. Д.

export namespace RecordsService { 

    let records: Array<Record> = new Array(); 

    function init() { 
     let record1 = new Record(new Date(), 1); 
    } 
    init(); 

    export function getAllRecords() { 
     return records; 
    } 

    class Record { 

     constructor (public date: Date, public id: number) { 
      this.date = date; 
      this.id = id; 
     } 
    } 
} 

выше не бросает какую-либо ошибки transpiling но когда бегал я получаю сообщение об ошибке с помощью консольной ниже

TypeError: Record is not a constructor(…)

линии, что ошибки есть let record1 = new Record(new Date(), 1); Как создать новую запись в этом случае ?

Plunker, просматривать журнал консоли, чтобы увидеть сообщение об ошибке: https://plnkr.co/edit/FNk8b1ZwA5HL3I7wAnTq?p=preview

ответ

1

Вы должны переместить Record класс быть выше функции init:

class Record { 
    constructor (public date: Date, public id: number) { 
     this.date = date; 
     this.id = id; 
    } 
} 

let records: Array<Record> = new Array(); 

function init() { 
    let record1 = new Record(new Date(), 1); 
} 
init(); 

Или вызовите функцию init после определения Record:

let records: Array<Record> = new Array(); 

function init() { 
    let record1 = new Record(new Date(), 1); 
} 

export function getAllRecords() { 
    return records; 
} 

class Record { 
    constructor (public date: Date, public id: number) { 
     this.date = date; 
     this.id = id; 
    } 
} 

init(); 

Причина, по которой это происходит i s, что javascript является интерпретированным языком, интерпретатор анализирует строку кода за другим, и поэтому он достигает части init() (в вашем исходном коде), прежде чем интерпретировать класс Record.

Содержание функции init не интерпретируется до тех пор, пока вы не выполните функцию, поэтому ее можно безопасно использовать перед определением класса и просто выполнить ее после.

Кроме того, если вы делаете это:

constructor (public date: Date, public id: number) 

Тогда нет необходимости делать это:

this.date = date; 
this.id = id; 

Это либо:

class Record { 
    constructor (public date: Date, public id: number) {} 
} 

Или

class Record { 
    public date: Date; 
    public id: number; 

    constructor (date: Date, id: number) { 
     this.date = date; 
     this.id = id; 
    } 
} 
+0

Спасибо, любовь, когда ошибки - это глупые вещи, которые я знаю, но не думал о –

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