Я определил этот объект в файле TypeScript и использовал следующий метод reduce(), и с ним нет проблем.
sampleList = {
totalRecordsTest: {},
sampleList: [
{
parent: 'Sample Text 2',
children: [
{
id: 1,
text: "Sample Text 1"
},
],
},
{
parent: 'Sample Text 2',
children: [
{
id: 2,
text: "Sample Text 2"
},
],
},
{
parent: 'Sample Text 3',
children: [
{
id: 3,
text: "Sample Text 3"
},
],
},
]
}
let grouped = this.sampleList.sampleList.reduce((groups, current) => {
groups[current.parent] = groups[current.parent] || [];
groups[current.parent].push(...current.children);
return groups;
}, Object.create(null));
this.groupedSampleList = Object.keys(grouped).map((key) => ({
parent: key,
children: grouped[key],
}));
Однако, когда я попытался создать файл интерфейса модели для «sampleList» в другом файле, я получаю сообщение об ошибке «Неопределенный тип» не может использоваться в качестве типа индекса в следующем методе для переменной Текущий.
Файл TypeScript
let grouped2 = this.sampleList.reduce((groups, current) => {
groups[current.parent] = groups[current.parent] || [];
groups[current.parent].push(...current.children);
return groups;
}, Object.create(null));
Импорт модели в TypeScript
sampleList: SampleList[] = []
Файл модели
export interface SampleListModel {
parent?: string | '-',
children?: ChildrenSampleModel[];
}
export class SampleList implements SampleListModel {
constructor(
public parent?: string | '-',
public children?: ChildrenSampleModel[]
) { }
}
export interface ChildrenSampleModel {
id?: number,
text?: string
}
export class ChildrenSample implements ChildrenSampleModel {
constructor(
public id?: number,
public text?: string
) { }
}
Решение
parent
объявлен как необязательный, поэтому он может быть неопределенным, и когда я использую его в качестве индекса, он выдает ошибку «Тип« не определен »не может использоваться в качестве типа индекса в следующем методе для текущей переменной».
export interface SampleListModel {
parent: string,
children: ChildrenSampleModel[];
}
export class SampleList implements SampleListModel {
constructor(
public parent: string,
public children: ChildrenSampleModel[]
) { }
}
Это может быть потому, что parent
является необязательным в конструкторе SampleList
, поэтому он может быть неопределенным, и вы не можете использовать его в качестве индекса.
Вероятно, предоставление значения по умолчанию, такого как groups[current.parent ?? 'default']
, решит ошибку компиляции. Но я думаю, вы должны сначала спросить, что делать, если parent имеет значение null, а затем реализовать решение для этого случая. Может быть, протестировать его, прежде чем вы сделаете все это внутри сокращения, например if (current.parent) ...
(хотя я не знаю, решит ли это ошибку компилятора).
Да, я тоже только что это понял, но есть ли способ определить
parent
как необязательный в конструкторе, но использовать его как индекс?