在我的打字稿代碼中,我有這個片段:
pairs.forEach(([n, s]) => {
console.log(n * 3, s.toUpperCase());
});
我想行內“對”變數。我知道我可以這樣做:
([[3, "three"], [5, "five"]] as [number, string][]).forEach(([n, s]) => {
console.log(n * 3, s.toUpperCase());
});
但我不喜歡它,因為現在我的代碼變得更糟了。在行內之前,編譯器正在驗證陣列的每個元素是一對數字和一個字串 - 因此,例如,此代碼無法編譯:
const pairs: [number, string][] = [[3, "three"], [5, "five"], ["seven", 7]];
pairs.forEach(([n, s]) => {
console.log(n * 3, s.toUpperCase());
});
但是在 inline 之后,我的陣列的一種型別沒有被宣告。相反,我使用型別斷言,它告訴編譯器忽略它認為的型別是什么,并相信我所說的這個型別是什么。所以現在編譯器不會驗證陣列的每個元素是一對數字和一個字串。因此,例如,此代碼編譯,并且僅在運行時失敗:
([[3, "three"], [5, "five"], ["seven", 7]] as [number, string][]).forEach(([n, s]) => {
console.log(n * 3, s.toUpperCase());
});
我能否以某種方式同時擁有這兩種東西 - 都行內這個陣列并告訴編譯器它的型別是什么?我可以以某種方式宣告陣列文字的型別嗎?
uj5u.com熱心網友回復:
我認為你不能真正自動地做到這一點。
在let pairs = [[3, "three"], [5, "five"]]中,型別pairs是自動檢測的,(string | number)[][]而不是 as([number,string][] )
這就是為什么在行內之后,它的行為不像你希望的那樣,它只會使用(string | number)[][]它推斷的那個。
似乎自動檢測會在有機會時嘗試檢測可變長度陣列而不是元組。
因此,let x = [3,4]被檢測為number[]而不是[number,number]
并且
let pair = [3,'three']被檢測為(string|number)[]而不是[number,string]

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/449564.html
