[英]Typescript "Object literal may only specify known properties" not effects on Promise return function
打字稿將檢查未知的屬性:
(下面會有錯誤: "'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();
但是,如果函數返回 Promise ,Typescript 只會檢查缺少的屬性
(下面會出現錯誤: "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();
但不檢查未知屬性。
(下面不會有任何錯誤或警告)
期望:有錯誤"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();
這是預期的行為還是我在 Typescript 設置中遺漏了什么?
它沒有在您的示例中引發錯誤的原因是您的代碼沒有立即返回對象文字,而是返回調用函數的結果。 過多的屬性檢查僅適用於對象文字。 由於函數( Promise.resolve
)正在返回Promise<{a: boolean, b: boolean, c: number}>
並且與ok
的Promise<{a: boolean, b: boolean}>
返回類型賦值兼容, TypeScript 不會抱怨。
您可以通過向Promise.resolve
提供類型參數,讓 TypeScript 檢查傳遞給Promise.resolve
的對象字面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();
另外,您也可以使ok
的async
函數:
interface IReturnVal {
a: boolean;
b: boolean;
}
async function ok(): Promise<IReturnVal> {
// ^^^^^
return {
a: true,
b: false,
c: 1, // <== error here as desired
};
}
ok();
為免生疑問: async
函數總是返回承諾。 如果你返回一個非承諾,它會被包裹在一個承諾中,就像通過Promise.resolve
傳遞Promise.resolve
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.