Cómo definir una interfaz que tenga cualquier número de propiedades de un cierto tipo en TypeScript
Quiero definir una interfaz que tenga propiedades arbitrarias cuyo tipo sea siempre el mismo. Por ejemplo.
type Reducer<S, P> = (state: S, payload: P) => S
interface Reducers {
[name: string]: Reducer
}
Y luego úsalo así:
interface MyState {
foo?: string
bar?: string
}
const reducers: Reducers = {
r1: (state: MyState, payload: string) => {
return {foo: payload}
}
}
Sin embargo, no puedo hacer que esto se compile. El error del compilador es:
Error TS2314: El tipo genérico 'Reducer' requiere 2 argumentos de tipo.
¿Qué estoy haciendo mal?
Respuesta #1
Necesitas reenviar tus argumentos genéricos a tu interfaz Reducers:
interface Reducers<S, P> {
[name: string]: Reducer<S, P>
}
const reducers: Reducers<MyState, string> = {
r1: (state: MyState, payload: string) => {
return {foo: payload}
}
}
En caso de que el compilador no te permita definir tu método Reducer en línea (tuve algunos problemas con esto en el pasado), puedes definir el valor externamente:
const r1Reducer: Reducer<MyState, string> = (state: MyState, payload: string) => {
return {foo: payload}
}
const reducers: Reducers<MyState, string> = {
r1: r1Reducer;
}
Respuesta #2
Te faltan algunas notaciones de tipos genéricos en tu código.
type Reducer<S, P> = (state: S, payload: P) => S
interface Reducers<S, P> {
[name: string]: Reducer<S, P>
}
interface MyState {
foo?: string
bar?: string
}
const reducers: Reducers<MyState, string> = {
r1: (state: MyState, payload: string) => {
return { foo: payload }
}
}
Sin ellos, el compilador no puede determinar el tipo correcto de los tipos genéricos S y P.
