Этот метод позволяет легко добавлять значения параметров класса в соответствующие поля класса, где класс реализует этот интерфейс или, по крайней мере, имеет частичную имплантацию этого интерфейса.
interface IPerson {
firtName: string;
lastName: string;
}
class Person implements IPerson {
public firtName!: string;
public lastName!: string;
constructor(params: IPerson) {
Object.assign(this, params);
}
}
Ваше приложениеработает, потому что вы, кажется, реализовали это таким образом, что также достаточно значения обратного вызова values
.
Основная проблема с этим хаком заключается в том, что Object.assign не является безопасным типом .Таким образом, использование его таким образом противоречит точке зрения TypeScript.
Если вы хотите сделать это безопасным для типов способом, вам лучше использовать пользовательскую реализацию, в которой тип проверен правильно.Примерно так:
type PDM = PropertyDescriptorMap;
export class ClassSAssign<T> {
constructor(private objectToSpread: T, private klass: T) {}
private propertyDescriptorOptions = {
enumerable: true,
writable: true
};
public apply(): void {
const map = this.getPropertiesDescriptorMap();
Object.defineProperties(this.klass, map);
}
private getPropertiesDescriptorMap(): PDM {
return Object.entries(this.objectToSpread).reduce(
(obj: PDM, entry) => this.getPropertyDescriptorMap(obj, entry),
{}
);
}
private getPropertyDescriptorMap(obj: PDM, [key, value]: [string, any]): PDM {
return {
...obj,
[key]: {
value,
...this.propertyDescriptorOptions
}
};
}
}
и вы можете использовать эту утилиту следующим образом:
class Person implements IPerson {
public firtName!: string;
public lastName!: string;
constructor(params: IPerson) {
new ClassSAssign(params, this).apply();
}
}
Если вы не хотите / не хотите использовать вышеперечисленное, я предлагаю вам по адресухотя бы добавьте некоторую строгость типов, чтобы защитить ваш класс от того, какие значения могут быть переданы ему
interface IToDo {
id?: number;
title?: string;
}
export class Todo implements IToDo {
public id?: number;
public title?: string;
public complete: boolean = false;
public editMode: boolean = false;
constructor(values?: IToDo) {
Object.assign(this, values);
}
}