索引簽章
在 TypeScript
中,用來定義 Object(物件)
或者 Class(類別)
的 索引類型及對應索引值的類型。
讓我們透過一些簡單的實例來看看是怎麼操作的。 今天我們為了組資料方便,把 Get 要用的 params 弄成了一個物件,但是我們要送出請求時,還是需要把他解析在網址後面 (好啦 我們先假裝 axios 沒有 params 可以帶好嗎?)。 所以我們設計了一個公用函數:
formatToURLParams(data: {
[key: string]: number | string | number[] | string[]
}) {
const params = new URLSearchParams();
Object.keys(data).forEach((key) => {
if (Array.isArray(data[key])) {
if (data[key].length > 0) {
data[key].forEach((item) => {
params.append(key, item.toString());
});
} else {
params.append(key, '');
}
} else {
params.append(key, data[key].toString());
}
});
return params;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
data
的型別就是所謂的 Index Signatures(索引簽章)
, 這樣不管 data
這個物件進來有幾組值,只要符合規則就可以組出我們想要的字串。
接下來我們來使用他:
interface iGetCalendarData {
date: string;
userId: 11,
target: number[];
}
function getCalendar (data: iGetCalendarData) {
const paramsString = formatToURLParams(data);
axios({
url: `/api/getCalendar&`
method: 'GET'
}).then(() => {});
}
2
3
4
5
6
7
8
9
10
11
12
13
類型 'iGetCalendarData' 的引數不可指派給類型 '{ [key: string]: string | number | number[] | string[]; }' 的參數。 類型 'string' 的索引簽章在類型 'iGetCalendarData' 中遺失。ts(2345)
這個問題的核心在於 iGetCalendarData 類型與 formatToURLParams 函數所期望的參數類型不匹配。具體來說,formatToURLParams 函數期望接收一個物件,該物件的屬性值可以是 number、string、number[] 或 string[]。然而,iGetCalendarData 類型的定義並不符合這個要求。
這個函數的目的是將一個物件轉換為 URL 查詢參數。它遍歷物件的每個鍵,並將其值轉換為字串後添加到 URLSearchParams 中。
問題出在 iGetCalendarData 類型的定義上。假設 iGetCalendarData 類型如下:
interface iGetCalendarData {
// 假設有一些屬性
date: string;
events: number[];
// 其他屬性...
}
2
3
4
5
6
這個類型缺少一個索引簽章,這意味著它不能被用作 formatToURLParams 函數的參數。
要解決這個問題,我們可以為 iGetCalendarData 添加一個索引簽章,使其符合 formatToURLParams 的參數要求:
interface iGetCalendarData {
[key: string]: string | number | number[] | string[];
date: string;
events: number[];
// 其他屬性...
}
2
3
4
5
6
這樣,iGetCalendarData 類型就可以被用作 formatToURLParams 函數的參數了。
希望這個解釋能幫助你理解並解決這個問題。如果有其他問題,請隨時告訴我。