No estoy seguro de dónde debo poner mi código dentro de la tienda NgRx.
Así que tengo una tienda NgRx con un reductor como este (en su mayoría generado automáticamente con CLI):
import { createReducer, on } from '@ngrx/store'; import { addTodo } from './todo.actions'; export const todosFeatureKey = 'todos'; export interface Todo { id: number, name: string, } export interface TodosState { todos: Todo[], } export const initialState: TodosState = { todos: [], }; export const todosReducer = createReducer( initialState, on(addTodo, (state, todo) => ({ ...state, todos: [...state.todos, todo ] })), );Necesito obtener una matriz de cadenas que representen las claves de una interfaz de Todo. Como esto:
const keysOfTodo: string[] = ??? console.log(keysOfTodo); // ['id', 'name']Se hizo una pregunta similar aquí: Obtener claves de una interfaz Typescript como matriz de cadenas
Y seguí esta respuesta: https://stackoverflow.com/a/59806829/7214068
Y escribió algo como esto:
class TodoClass { id = 0; name = ""; } interface Todo extends TodoClass { }; const keysOfTodo = Object.keys(new TodoClass ()) as (keyof TodoClass )[]; console.log(keysOfTodo); // ['id', 'name']Pero mi pregunta es: ¿dónde debo poner este código dentro de la tienda NgRx?
Mi intuición fue que debería poner esta clase auxiliar dentro de mi archivo reducer.ts junto con la interfaz. Y luego podría declarar const keysOfTodo a pedido donde lo necesite.
Pero luego pensé que probablemente debería convertirla en una función reutilizable e inmediatamente pensé en los selectores NgRx. Sin embargo, esto (aunque funciona) no parece del todo correcto.
import { createSelector } from "@ngrx/store"; import { AppState } from "../app.state"; import { Todo, TodoClass, TodosState } from "./todo.reducer"; export const selectTodos = (appState: AppState) => appState.todos; export const selectAllTodos = createSelector( selectTodos, (state: TodosState) => state.todos, ); export const selectTodoKeys = () => Object.keys(new TodoClass()) as (keyof Todo)[]; export const selectAllTodoKeys = createSelector(selectTodoKeys);Keys of Todo probablemente no sea algo que cambie durante el tiempo de ejecución, por lo que realmente no creo que deba ser reactivo. Pero aparte de los selectores, no sé dónde debo poner esa función. ¿Tal vez debería crear un archivo separado para almacenar solo tipos? ¿O simplemente exportarlo directamente dentro de un archivo reductor? ¿Qué piensas? ¿Cuál es el enfoque típico de NgRx?