我正在嘗試從使用切換<array>.at()到<array>.[]一致性。但這是我遇到的一個問題:
const array: string[] = [];
if (array[0]) {
const item = array[0]; // string
}
if (array.at(0)) {
const item = array.at(0); // string | undefined
}
if (array[0]) {
const item = array.at(0); // string | undefined
}
為什么型別不同?我錯過了什么?我已經閱讀了有關at()方法的資訊,但關于打字稿的資訊并不多。
uj5u.com熱心網友回復:
使用這些if (array[0])-style 型別保護(特別是因為您現在已經說過您noUncheckedIndexedAccess啟用了該選項),可以說答案只是 TypeScript 不會在函式呼叫中縮小型別。畢竟,在一般情況下,函式可以在每次呼叫時回傳不同的值(并非所有函式都是pure)。
您可以使用以下命令將其鎖定const:
// Note: `noUncheckedIndexedAccess` enabled
const array: string[] = [];
if (array[0]) {
const item = array[0];
// ^? ???? string
console.log(array[0]); // string
}
const item1 = array.at(0);
if (item1) {
console.log(item1);
// ^? ???? string
}
游樂場鏈接
但這提出了一個有趣的問題,為什么沒有警衛他們是不同的(如果你沒有啟用noUncheckedIndexedAccess)?
const array: string[] = [];
const i1 = array[0];
// ^? ???? string
const i2 = array.at(0);
// ^? ???? string | undefined
游樂場鏈接
我懷疑原因有兩個:
很久以前,TypeScript 團隊做出了務實的決定,即(默認情況下1)對陣列的索引訪問(如 a
string[])應該回傳陣列的元素型別(string),而不是陣列的元素型別或undefined(string | undefined),即使后者更正確解釋屬性訪問(實際上是索引訪問)以及您確實可以undefined從中獲得的運行時現實。想象一下如果沒有 TypeScript 代碼會有多尷尬!每個陣列訪問都會涉及一個| undefined最終會用非空斷言或其他東西亂扔代碼。所以他們采取了務實的態度。該
at方法的范圍比一般的索引訪問更有限——它根本不打算在任何地方替換索引訪問,它的主要用例是當索引為負數時。所以它的型別反映了它可能回傳的事實undefined,因為它不需要到處都使用非空斷言——只在你使用at而不是索引訪問的地方。因此,沒有理由不與規范保持一致,在這種情況下,型別與規范緊密一致會更有用。
1 Re“默認情況下”:您可以| undefined通過noUncheckedIndexedAccess選項告訴 TypeScript 您希望索引訪問包含在內。啟用該選項后,我上面的示例變為:
// With `noUncheckedIndexedAccess` enabled
const array: string[] = [];
const i1 = array[0];
// ^? ???? string | undefined <== Changed
const i2 = array.at(0);
// ^? ???? string | undefined
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468667.html
上一篇:在Stackblitz中單獨使用AngularMaterialButton?
下一篇:使用包含的聯合型別錯誤陣列
