Typescript comprobará las propiedades desconocidas:
(a continuación tendrá un error: "'c' does not exist in type..." )
interface IReturnVal { a: boolean; b: boolean; } function oh(): IReturnVal { return { a: true, b: false, c: 1, // Type '{ a: true; b: false; c: number; }' is not assignable to type 'IReturnVal'. Object literal may only specify known properties, and 'c' does not exist in type 'IReturnVal'.ts(2322) }; } oh();Sin embargo, si las funciones devuelven Promise , Typescript solo verificará las propiedades faltantes
(a continuación tendrá un error: "Property 'a' is missing in type..." )
interface IReturnVal { a: boolean; b: boolean; } function ok(): Promise<IReturnVal> { // Property 'a' is missing in type .... return Promise.resolve({ b: false, }); } ok();Pero no verificar propiedades desconocidas .
(a continuación no tendrá ningún error o advertencia)
esperar: tiene el error "Object literal may only specify known properties..."
interface IReturnVal { a: boolean; b: boolean; } function ok(): Promise<IReturnVal> { return Promise.resolve({ a: true, b: false, c: 1, // will not cause any error or warning }); } ok();¿Es este el comportamiento esperado o me falta algo en la configuración de Typescript?
La razón por la que no genera un error en su ejemplo es que su código no devuelve inmediatamente un objeto literal, sino que devuelve el resultado de llamar a una función. Las comprobaciones de propiedad en exceso solo se aplican a los objetos literales. Dado que la función ( Promise.resolve ) está devolviendo Promise<{a: boolean, b: boolean, c: number}> y eso es compatible con la asignación con el tipo de retorno Promise<{a: boolean, b: boolean}> de ok , TypeScript no se queja.
Puede hacer que TypeScript verifique el objeto literal que está pasando a Promise.resolve proporcionando un argumento de tipo a Promise.resolve :
interface IReturnVal { a: boolean; b: boolean; } function ok(): Promise<IReturnVal> { return Promise.resolve<IReturnVal>({ // ^^^^^^^^^^^^ a: true, b: false, c: 1, // <== error here as desired }); } ok(); Alternativamente, puede hacer que ok sea una función async :
interface IReturnVal { a: boolean; b: boolean; } async function ok(): Promise<IReturnVal> { // ^^^^^ return { a: true, b: false, c: 1, // <== error here as desired }; } ok(); Para evitar dudas: las funciones async siempre devuelven promesas. Si devuelve una no promesa, se envuelve en una promesa como si pasara a través Promise.resolve .