Ответ 1
Причина, по которой компилятор позволяет вам передать объект, возвращаемый из JSON.parse
в класс, потому что typescript основан на структурном подтипировании.
У вас действительно нет экземпляра Employee
, у вас есть объект (как вы видите на консоли), который имеет те же свойства.
Простейший пример:
class A {
constructor(public str: string, public num: number) {}
}
function logA(a: A) {
console.log(`A instance with str: "${ a.str }" and num: ${ a.num }`);
}
let a1 = { str: "string", num: 0, boo: true };
let a2 = new A("stirng", 0);
logA(a1); // no errors
logA(a2);
Нет ошибки, потому что a1
удовлетворяет типу A
, потому что он имеет все свои свойства, а функция logA
может быть вызвана без ошибок времени выполнения, даже если то, что она получает, не является экземпляром A
пока он обладает теми же свойствами.
Это отлично работает, когда ваши классы являются простыми объектами данных и не имеют методов, но как только вы вводите методы, тогда все имеет тенденцию ломаться:
class A {
constructor(public str: string, public num: number) { }
multiplyBy(x: number): number {
return this.num * x;
}
}
// this won't compile:
let a1 = { str: "string", num: 0, boo: true } as A; // Error: Type '{ str: string; num: number; boo: boolean; }' cannot be converted to type 'A'
// but this will:
let a2 = { str: "string", num: 0 } as A;
// and then you get a runtime error:
a2.multiplyBy(4); // Error: Uncaught TypeError: a2.multiplyBy is not a function
Изменить
Это прекрасно работает:
const employeeString = '{"department":"<anystring>","typeOfEmployee":"<anystring>","firstname":"<anystring>","lastname":"<anystring>","birthdate":"<anydate>","maxWorkHours":0,"username":"<anystring>","permissions":"<anystring>","lastUpdate":"<anydate>"}';
let employee1 = JSON.parse(employeeString);
console.log(employee1);
Если вы пытаетесь использовать JSON.parse
для своего объекта, если это не строка:
let e = {
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": 3,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
}
let employee2 = JSON.parse(e);
Тогда вы получите ошибку, потому что это не строка, это объект, и если вы уже имеете ее в этой форме, тогда нет необходимости использовать JSON.parse
.
Но, как я писал, если вы идете с этим путем, то у вас не будет экземпляра класса, просто объекта, который имеет те же свойства, что и члены класса.
Если вам нужен экземпляр, то:
let e = new Employee();
Object.assign(e, {
"department": "<anystring>",
"typeOfEmployee": "<anystring>",
"firstname": "<anystring>",
"lastname": "<anystring>",
"birthdate": "<anydate>",
"maxWorkHours": 3,
"username": "<anystring>",
"permissions": "<anystring>",
"lastUpdate": "<anydate>"
});