Búsqueda de sitios web

tipos - TypeScript: Implementar una interfaz con firma de llamada y firma de indexación


Me gustaría crear un objeto que cumpla con este tipo:

interface I {
    (): string;
    [x: string]: number;
}

y pasa la verificación de tipos de TypeScript. Idealmente, me gustaría no tener que recurrir a trucos como usar any como un paso intermedio.

Sé que se pueden agregar campos adicionales a una interfaz que tiene una firma de llamada, como se describe aquí: Implementando una interfaz de TypeScript con una firma de función simple más otros campos.

Intenté escribir:

const foo: I = Object.assign(
    // Callable signature implementation
    () => 'hi',
    {
        // Additional properties
        text2: 3
    }
)

pero recibo el error: Type '(() => "hi") & { text2: number; }' is not assignable to type 'I'. Index signature is missing in type '(() => "hi") & { text2: number; }'.

Me daría curiosidad saber si hay una manera de crear un objeto que implemente la interfaz I.

Respuesta #1

Puedes hacer esto sin una afirmación si no defines el tipo como una interfaz sino como un alias de tipo para un tipo de intersección:

type I =  {
    (): string;
} & {
    [x: string]: number;
}
// Will work
let d:I= Object.assign(function() { return ""}, {
    text: 10
});

No estoy seguro de por qué uno funciona y el otro no, su estructura pública es esencialmente la misma, podría ser un error del compilador.

Editar Enviado un error, tendremos que esperar una respuesta

Respuesta #2

Probablemente podrías hacer algo así

Básicamente, primero declaras una función con la firma de llamada correcta, luego agregas cualquier propiedad con la firma de índice correcta. Luego devuelves el valor (o lo asignas a una nueva referencia como en el ejemplo) usando la palabra clave as para la afirmación de tipo.

Aún más simple, usa la afirmación de tipo en la primera declaración.