javascript - Usar una interfaz de muchas para los parámetros en una función
Tengo una función así:
interface Interface1 {
one: string
}
interface Interface2 {
two: string
}
interface Interface3 {
three: string
}
type ManyInterfacesInOneType = Interface1 | Interface2 | Interface3;
function bla(param1: ManyInterfacesInOneType) {
}
Cuando intento usar la función así y llamo a la función como bla({...}), me permite poner variables de todas las interfaces, pero quiero que la función esté limitada a una de muchas. Así que no quiero que esto suceda:
bla({one: '', two: '', three: ''});
También intenté hacer:
function bla<T extends object>(param1: T) {
}
Pero esto no hace que el tipo genérico sea obligatorio, así que ni siquiera ayuda realmente.
¿Alguna idea de cómo puedo hacer que esto funcione?
Respuesta #1
Es posible hacerlo con un pequeño ayudante:
interface Interface1 {
one: string
}
interface Interface2 {
two: string
}
interface Interface3 {
three: string
}
type Union = Interface1 | Interface2 | Interface3;
// credits goes to https://stackoverflow.com/questions/65805600/type-union-not-checking-for-excess-properties#answer-65805753
type UnionKeys<T> = T extends T ? keyof T : never;
type StrictUnionHelper<T, TAll> =
T extends any
? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>> : never;
type StrictUnion<T> = StrictUnionHelper<T, T>
function bla<T extends Union,>(param1: StrictUnion<Union>) {
}
bla({ one: 'one' }) // ok
bla({one:'one', two:'two'}) // error
Parque infantil
Aquí, en mi blog, puedes encontrar más ejemplos de tipos de utilidad que son útiles en la práctica, porque todos ellos se toman de aquí (stackoverflow)
