我遇到了 TypeScript 的一個問題,即使用一種型別的物件可以通過破壞性賦值注入到另一個使用完全不同型別的物件中,并且 TypeScript 沒有顯示任何錯誤。
一個例子是:
interface Pizza {
cookingTime: number;
size: "Small" | "Medium" | "Large";
}
interface Car {
modelName: string;
yearManufactured: number;
}
const produceMalformedPizza = (car: Car): Pizza => {
return {
...car, // This is not a "Pizza" object but no errors are raised
cookingTime: 10,
size: "Small",
}
}
console.log(
produceMalformedPizza({
modelName: "NotAPizza",
yearManufactured: 1980
})
)
/* Output:
[LOG]: {
"modelName": "NotAPizza",
"yearManufactured": 1980,
"cookingTime": 10,
"size": "Small"
}
*/
我已嘗試打開所有可能的嚴格標志 — 您可以在此處在線查看它的編譯情況。
如果我嘗試回傳produceMalformedPizza函式中的任何特定屬性,那么編譯器會按預期引發錯誤——但似乎我可以使用解構(擴展)賦值注入任意物件資料。
我對 TypeScript 比較陌生,所以這也許是預期的行為?即我不能使用推斷型別安全的物件傳播解構?
編輯:
根據@TJCrowder 的回答,這是故意的。
- 這里有一些關于這個問題的GitHub 討論:https : //github.com/microsoft/TypeScript/issues/43499,
- 還有一個在這里支持“精確”型別的提議:https : //github.com/microsoft/TypeScript/issues/12936
uj5u.com熱心網友回復:
這是預期的行為。您傳回的物件是一個亞型的Pizza -它所有的性能Pizza要求(加上一些事實并非如此)。
TypeScript 確實會進行“過多的屬性檢查”,但僅限于有限的情況。例如,如果您要Pizza在該物件字面量中顯式地放置一個非屬性,TypeScript 會標記出來,不是因為從型別的角度來看它實際上是錯誤的(使用子型別很好),而是因為這可能是程式員的錯誤。
我有點驚訝它沒有這樣做...car(因為car有必需的屬性),但它不會在所有情況下進行額外的屬性檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/366077.html
標籤:打字稿
