鑒于以下情況:
type Arr = (0|1)[]
const arr: Arr = [0, 1]
const someNumber: number = 5;
arr.includes(someNumber);
// ^^^^^^^^^^
// Argument of type 'number' is not assignable to parameter of type '0 | 1'.
操場
有沒有一種方法可以在arr.includes(someNumber)不更改定義Arr或進行某些型別轉換的情況下為 TypeScript 作業?
這個錯誤不會破壞使用的目的Array.prototype.includes()嗎?
該
includes()方法確定陣列是否在其條目中包含某個值,回傳true或false酌情。
uj5u.com熱心網友回復:
這個錯誤不會破壞使用 Array.prototype.includes() 的目的嗎?
并不真地。這只是 TypeScript 的作業:使代碼型別安全。您已經說過arr只能包含值or ,因此使用不能在陣列中的值進行呼叫是型別錯誤。(也就是說,我絕對可以看到一個接受的論點,而不是在這樣的情況下。我懷疑有相反的論點。)01includesincludesnumber0 | 1
您可以撰寫一個實用函式來檢查 anumber是否是 的有效元素arr:
const isValidArrElement = (value: number): value is Arr[number] => {
return value === 0 || value === 1;
};
然后在使用之前使用它includes:
const arr: Arr = [0, 1]
const someNumber: number = 5;
if (isValidArrElement(someNumber) && arr.includes(someNumber)) {
// ...
}
游樂場鏈接
但我通常更喜歡用另一種方式來解決這個問題,這樣我就不會在兩個地方寫0and1并造成維護危險:
const validArrElements = [0, 1] as const;
type ArrElement = (typeof validArrElements)[number];
// ^? -- type is 0 | 1
const isValidArrElement = (value: number): value is ArrElement => {
return (validArrElements as readonly number[]).includes(value);
};
請注意,其中isValidArrElement 確實有一個型別斷言。我對此并不擔心,因為我只在這對事物中執行此操作(有效值的常量陣列和它們的型別檢查器)。
用法同上:
const arr: Arr = [0, 1]
const someNumber: number = 5;
if (isValidArrElement(someNumber) && arr.includes(someNumber)) {
// ...
}
游樂場鏈接
uj5u.com熱心網友回復:
您定義了一個聯合型別,由它組成,0 | 1這意味著您的陣列值將使用 value0或進行型別保護1。這就是聯合型別在 Typescript 中的作業方式。
通常的陣列將使用如下的原始型別定義
const arr: Array<number> = [0, 1]
這是選擇之一
但是,如果您仍想使用聯合型別定義,則可以將其強制轉換number[]為允許在陣列函式中使用的所有數字
type Arr = (0|1)[]
const arr: Arr = [0, 1]
const someNumber: number = 5;
(arr as readonly number[]).includes(someNumber) //correct
const someString: string = "5";
(arr as readonly number[]).includes(someString) //error
操場
uj5u.com熱心網友回復:
let scores : (string | number)[];
scores = ['Programming', 5, 'Software Design', 4];
const someNumber: number = 5
console.log('scores.includes(someNumber)', scores.includes(someNumber))
它正在回歸 True
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468668.html
標籤:打字稿
