Búsqueda de sitios web

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)