Typescript will check unknown properties:
(below will have 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();
However if functions returning Promise, Typescript will only check for missing properties
(below will have 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();
But not checking unknown properties.
(below will not have any error or warning)
expect: Have 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();
Is this the expect behavior or I'm missing something in Typescript setting?
CodePudding user response:
The reason it's not raising an error in your example is that your code isn't immediately returning an object literal, it's returning the result of calling a function. Excess property checks only apply to object literals. Since the function (Promise.resolve
) is returning Promise<{a: boolean, b: boolean, c: number}>
and that's assignment-compatible with ok
's Promise<{a: boolean, b: boolean}>
return type, TypeScript doesn't complain.
You can make TypeScript check the object literal you're passing into Promise.resolve
by providing a type argument to 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();
Alternatively, you can make ok
an async
function:
interface IReturnVal {
a: boolean;
b: boolean;
}
async function ok(): Promise<IReturnVal> {
// ^^^^^
return {
a: true,
b: false,
c: 1, // <== error here as desired
};
}
ok();
For the avoidance of doubt: async
functions always return promises. If you return a non-promise, it gets wrapped in a promise as though passed through Promise.resolve
.