Javascript 类型为'的参数;{[key:string]:any;}';不可分配给类型为';任何[]和#x27;

Javascript 类型为'的参数;{[key:string]:any;}';不可分配给类型为';任何[]和#x27;,javascript,angular,typescript,angular-material,lodash,Javascript,Angular,Typescript,Angular Material,Lodash,我正在尝试使用ngrx做一个简单的口袋妖怪应用程序。我正在使用lodash库做一个键值数组。我在填充MatTableDataSource所需的几乎所有步骤中都取得了成功,但我不知道如何为其提供正确的类型。因此,我需要接收数据并用它填充dataSource.data,但我收到了以下错误:“类型为“{[key:string]:any;}”的参数不能分配给类型为“any[]”的参数。类型“{[key:string]:any;}”缺少类型“any[]”的以下属性:长度、弹出、推送、concat等”。因此

我正在尝试使用ngrx做一个简单的口袋妖怪应用程序。我正在使用lodash库做一个键值数组。我在填充MatTableDataSource所需的几乎所有步骤中都取得了成功,但我不知道如何为其提供正确的类型。因此,我需要接收数据并用它填充dataSource.data,但我收到了以下错误:“类型为“{[key:string]:any;}”的参数不能分配给类型为“any[]”的参数。类型“{[key:string]:any;}”缺少类型“any[]”的以下属性:长度、弹出、推送、concat等”。因此,不呈现我的表。如何为我的MatTableDataSource提供正确的类型或修复此问题

问候

我的可观察对象可以听到响应并将值设置为MatTableDataSource '口袋妖怪.component.ts'

public readonly pokemonsSubscription = this.store.pipe(select(fromPokemons.pokemons)).subscribe(pokemons => {
    if (!pokemons || pokemons.length === 0) {
      return;
    }
    //the error is below
    this.dataSource.data = new MatTableDataSource(pokemons);

    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
  });
这是我的口袋妖怪存储器'pokemon.store.ts'

export const selectPokemonsState = (appState: AppState) => appState.Pokemons;

export const pokemons = createSelector(selectPokemonsState, (pokemonsState: PokemonsState) => pokemonsState.pokemons);
export const isLoading = createSelector(selectPokemonsState, (pokemonsState: PokemonsState) => pokemonsState.isLoading);
export const initial = createSelector(selectPokemonsState, (pokemonsState: PokemonsState) => pokemonsState.initial);
export const final = createSelector(selectPokemonsState, (pokemonsState: PokemonsState) => pokemonsState.final);
这些是我的动作“口袋妖怪.动作.ts”

export enum Action {
    PokemonsLoad = '[Pokemons] Load',
    PokemonsLoadSuccess = '[Pokemons] Load Success',
    PokemonsLoadError = '[Pokemons] Load Error',
    PokemonLoadByQuantity = '[Pokemon] Load By Quantity',
    PokemonLoadByQuantitySuccess = '[Pokemon] Load By Quantity Success',
    PokemonLoadByQuantityError = '[Pokemon] Load By Quantity Error',
}

export const PokemonsLoad = createAction(Action.PokemonsLoad);
export const PokemonsLoadSuccess = createAction(Action.PokemonsLoadSuccess, props<{ payload: Array<any> }>());
export const PokemonsLoadError = createAction(Action.PokemonsLoadError, props<{ payload: any }>());
export const PokemonLoadByQuantity = createAction(Action.PokemonLoadByQuantity, props<{ payload: { initial: number, final: number }}>());
export const PokemonLoadByQuantitySuccess = createAction(Action.PokemonLoadByQuantitySuccess, props<{ payload: Array<any> }>());
export const PokemonLoadByQuantityError = createAction(Action.PokemonsLoadError, props<{ payload: any }>());
特效“口袋妖怪.特效.ts”

@Injectable()
export class PokemonsEffects {

    loadAllPokemons$ = createEffect(() => this.actions$.pipe(
        ofType(Action.PokemonsLoad),
        switchMap((payload) => {
            return this.pokemonsService.getAllPokemons()
                .pipe(
                    map(pokemons => (PokemonsLoadSuccess({ payload: pokemons }))),
                    catchError((msg) => of(PokemonsLoadError({ payload: msg }))),
                );
        })
    )
    );

    loadPokemonByQuantity$ = createEffect(() => this.actions$.pipe(
        ofType(Action.PokemonLoadByQuantity),
        switchMap((payload) => {
            return this.pokemonsService.loadPokemonByQuantity(payload['payload']['initial'], payload['payload']['final'])
                .pipe(
                    map(pokemons => (PokemonLoadByQuantitySuccess({ payload: pokemons }))),
                    catchError((msg) => of(PokemonLoadByQuantityError({ payload: msg }))),
                );
        })
    )
    );

    success$ = createEffect(() => this.actions$.pipe(
        ofType<{ type: string, payload: any }>(
            // Action.PokemonsLoadSuccess,
            // Action.PokemonLoadByQuantitySuccess,
        ),
        tap(({ type, payload }) => { window.alert('Sucesso'); })
    ), { dispatch: false });

    error$ = createEffect(() => this.actions$.pipe(
        ofType<{ type: string, payload: string }>(
            Action.PokemonsLoadError,
            Action.PokemonLoadByQuantityError,
        ),
        tap(({ type, payload }) => { window.alert('Erro'); }),
    ), { dispatch: false });

    constructor(private actions$: Actions, private pokemonsService: PokemonsService) { }
}
@Injectable()
导出类口袋妖怪效果{
loadAllPokemons$=createEffect(()=>this.actions$.pipe(
类型(Action.PokemonsLoad),
开关映射((有效负载)=>{
返回这个.pokemonsService.getAllPokemons()
.烟斗(
map(pokemons=>(pokemonsloadsucture({payload:pokemons})),
catchError((msg)=>of(PokemonsLoadError({payload:msg})),
);
})
)
);
loadPokemonByQuantity$=createEffect(()=>this.actions$.pipe(
类型(Action.pokemonoladbyQuantity),
开关映射((有效负载)=>{
返回此.pokemonsService.loadPokemonByQuantity(有效载荷['payload']['initial'],有效载荷['payload']['final'])
.烟斗(
map(pokemons=>(PokemonLoadByQuantitySuccess({payload:pokemons})),
catchError((msg)=>of(PokemonLoadByQuantityError({payload:msg})),
);
})
)
);
成功$=createEffect(()=>this.actions$.pipe(
类型(
//Action.pokemonsloadsucture,
//Action.PokemonLoadByQuantitySuccess,
),
点击({type,payload})=>{window.alert('Sucesso');})
),{调度:false});
错误$=createEffect(()=>this.actions$.pipe(
类型(
Action.PokemonsLoadError,
Action.PokemonLoadByQuantityError,
),
点击({type,payload})=>{window.alert('Erro');}),
),{调度:false});
构造函数(私有操作$:操作,私有pokemonsService:pokemonsService){}
}
下面是我对这个错误的警告


该错误表示您正试图将对象分配给array类型的属性。在下面的行中:

this.dataSource.data = new MatTableDataSource(pokemons);
MatTableDataSource()
需要一个数组,但似乎
pockemons
不是一个合适的对象数组。例如,您可以通过执行
console.log(Array.isArray(pockemons))来验证这一点

一旦确认
pockemons
不是对象数组,就可以将该对象放入对象数组中(或发布单独的问题)

您还应该将上面的行更改为此(删除
.data
):

更新

仔细检查你的stackblitz后,似乎当从商店中检索到
口袋妖怪时,即使它是一系列对象,也不会以对象数组的形式出现

我正在使用lodash库做一个键值数组

您根本没有创建数组,它实际上是对象的对象,示例:

{
"1": {
“名称”:“bulbasaur”,
“url”:”https://pokeapi.co/api/v2/pokemon/1/",
“id”:1
},
"2": {
“姓名”:“ivysaur”,
“url”:”https://pokeapi.co/api/v2/pokemon/2/",
“id”:2
}
}
我不明白为什么您实际上需要这样做,根据您的表的设置方式,它需要一个类似于您从API获得的数组。无论如何,您正在使用
pokemonNumber
为您的口袋妖怪创建id,您将使用该id在
PokemonLoadByQuantitySuccess
中获取每个口袋妖怪的单独数据

因此,我会:

on(pokemonsActions.PokemonsLoadSuccess,(状态,{payload})=>(
{
……国家,

pokemons:PokemonNumber.PokemonNumber(有效载荷),//我们无法在stackblitz中看到您的代码。请使用stackblitz编辑器link进行更改。对不起,现在我更改了上面的链接。我知道这是一个对象,但我想在我的表中呈现该对象。有没有办法做到这一点?或者有办法将该对象解析为数组?
this.dataSource.data = new MatTableDataSource(pokemons);
this.dataSource = new MatTableDataSource(pokemons);