У меня есть интерфейс (A), с интерфейсом внутри (B). Интерфейс A используется в качестве массива интерфейса A.
Когда я обновляю интерфейс B в определенном интерфейсе A, ВСЕ тот же интерфейс B в любом интерфейсе A также обновляется.
Если я использую тот же метод, но устанавливаю атрибут интерфейса A, это правильно.
Я, например, сделал умный код.
У нас есть клиенты, которые съедают какой-то х продукт за минуты. Мне нужно знать, сколько ферм мне нужно, чтобы заслужить всех клиентов.
Клиент как продукт, eatByMinute и howMany (howMany Client).
Ферма как продукт, makeByMinute (сколько продукта делают за минуты).
Я добавляю «Интерфейс фермы» в «Интерфейс клиента» для получения большого объекта данных. А мне что посчитать "Сколько ферм мне нужно".
Если я установлю HowManyNeed в «Интерфейс фермы», все одинаковые «Интерфейс фермы» во всех «Интерфейс клиента» примут одно и то же значение.
Если я установлю HowManyFarmNeed в «Интерфейсе клиента», каждое значение будет правильным
Логика:
Init-> Пуск-> CountFarmNeed-> конец
const farms: IFarm[] =
[{
"name": "AppleFarm",
"product": "Apple",
"makeByMinute": 2
}, {
"name": "PerryFarm",
"product": "Perry",
"makeByMinute": 1
}
];
interface IFarm {
name: string,
product: string,
makeByMinute: number,
howManyNeed?: number
}
interface IClient {
name: string,
eatByMinute: number,
whatDoesEat: string,
howMany: number,
farm?: IFarm,
howManyFarmNeed?: number
}
export class Client {
static get(name: string, eatByMinute: number, whatDoesEat: string, howMany: number): IClient {
return {name: name, 'eatByMinute': eatByMinute, 'whatDoesEat': whatDoesEat, 'howMany': howMany}
}
}
export class Farm {
static getByProduct(product: string): IFarm {
//@ts-ignore: array.Find can return "Undefined" BUT function return IFarm. In this exemple is ok
return farms.find((item: IFarm) => item.product == product);
}
}
export default class Problem {
static init() {
let clients: IClient[] = [
Client.get('men', 0.25, 'Apple', 2000),
Client.get('women', 0.30, 'Perry', 1500),
Client.get('dog', 0.25, 'Apple', 3000),
];
clients = this.start(clients);
clients = this.countFarmNeed(clients);
this.end(clients)
}
static start(clients: IClient[]):IClient[] {
for (let c in clients) {
clients[c] = this.loadFarm(clients[c]);
}
return clients
}
static loadFarm(client: IClient): IClient {
client.farm = Farm.getByProduct(client.whatDoesEat);
return client;
}
static countFarmNeed(clients: IClient[]):IClient[] {
for (let c in clients) {
//@ts-ignore: clients[].farm possibly undifined. In this exemple is ok
clients[c].farm.howManyNeed = (clients[c].howMany * clients[c].eatByMinute) / clients[c].farm.makeByMinute;
//@ts-ignore: clients[].farm possibly undifined. In this exemple is ok
clients[c].howManyFarmNeed = (clients[c].howMany * clients[c].eatByMinute) / clients[c].farm.makeByMinute;
}
return clients
}
static end(clients:IClient[]){
console.log(clients)
}
}
Я ожидаю
[0].farm.howManyNeed:250;
[1].farm.howManyNeed:450;
[2].farm.howManyNeed:375;
Но на самом деле имеет:
[0].farm.howManyNeed:375;
[1].farm.howManyNeed:450;
[2].farm.howManyNeed:375;