Javascript 将通用对象字段获取为数组
我有一个对象,我想在Javascript 将通用对象字段获取为数组,javascript,typescript,typescript-generics,Javascript,Typescript,Typescript Generics,我有一个对象,我想在GenericComponent中使用它的数组属性servicelements 对象 interface MyObject { id: number; serviceElements: ServiceElement[]; } interface ServiceElement { id: number; } 通用组件 interface Props<Type> { service: GenericService<Type&g
GenericComponent
中使用它的数组属性servicelements
对象
interface MyObject {
id: number;
serviceElements: ServiceElement[];
}
interface ServiceElement {
id: number;
}
通用组件
interface Props<Type> {
service: GenericService<Type>;
}
export default class GenericComponent<Type> extends React.Component<Props, {}> {
....
private fillDataTable = (): void => {
service.list().then((data: Type[]) => {
data.forEach(record => {
// 1st attempt
const array: ServiceElement[] = record['serviceElements'];
// record['serviceElements'] gives the error:
/* TS7053: Element implicitly has an 'any' type because expression of type '"serviceElements"' can't be used to index type 'unknown'.
Property 'serviceElements' does not exist on type 'unknown'.
*/
//////////////
// 2th attempt
const array: ServiceElement[] = record['serviceElements' as keyof Type];
// const array gives the error:
/* TS2322: Type 'Type[keyof Type]' is not assignable to type 'ServiceElement[]'.
Type 'Type[string] | Type[number] | Type[symbol]' is not assignable to type 'ServiceElement[]'.
Type 'Type[string]' is not assignable to type 'ServiceElement[]'.
*/
}
}
}
....
}
那么,我如何才能进入GenericComponent
中记录的字段servicelements
作为数组在其上循环
我已经添加了您可能需要的.map()
仅基于上述信息,我们可能无法帮助您,我们需要更多详细信息。但是您可能需要const array=record.servicelements代码>。不需要括号表示法,TypeScript将根据record.serviceElements
@T.J.Crowder的类型推断数组的类型。我刚刚编辑了这个问题。对不起,我只是不想通过发送所有不必要的代码来让事情变得更复杂。我想这就足够了。类型的定义是什么?您的代码期望类型
具有字符串索引访问权限和/或servicelements
属性。如果justrecord.servicelements
不起作用,那么Type
就没有该类型。我注意到您正在做很多显式键入的事情,例如then
处理程序上的数据
参数,承诺service.list()
返回。如果service.list
是属性定义的,则不需要这样做,这样做会使维护更加困难。@t.J.Crowder类型的防御在本例中是MyObject
,因为我称它为
。我非常确定MyObject
具有您上面看到的servicelements
。我认为typescript编译器不允许任何类型的。我还将service.list().then((数据:Type[])
更改为service.list().then(数据
,事实上,这并不需要;)m.serviceElements
给出错误:TS2339:类型“Type”上不存在属性“serviceElements”。
<GenericComponent<MyObject> service={new MyObjectService()}/>
data.map(m => m.serviceElements)
.forEach(se => {
// TODO: THINGS
});