Skip to content
    在 Opshell 的 Blog 中:
  • 目前已分享 72 篇文章
  • 還有 145 個坑正在填補中
  • 已有: Loading 次觀看
  • 已有: Loading 個人來過
✍️ Opshell
📆 Last Updated:1/17/2025Created:2025/01/17
👀 已被閱讀: Loading
🏷️ typescript

索引簽章

TypeScript 中,用來定義 Object(物件) 或者 Class(類別) 的 索引類型及對應索引值的類型。

讓我們透過一些簡單的實例來看看是怎麼操作的。 今天我們為了組資料方便,把 Get 要用的 params 弄成了一個物件,但是我們要送出請求時,還是需要把他解析在網址後面 (好啦 我們先假裝 axios 沒有 params 可以帶好嗎?)。 所以我們設計了一個公用函數:

ts
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;
}

data 的型別就是所謂的 Index Signatures(索引簽章), 這樣不管 data 這個物件進來有幾組值,只要符合規則就可以組出我們想要的字串。

接下來我們來使用他:

ts
interface iGetCalendarData {
    date: string;
    userId: 11,
    target: number[];
}

function getCalendar (data: iGetCalendarData) {
    const paramsString = formatToURLParams(data);
    axios({
        url: `/api/getCalendar&`
        method: 'GET'
    }).then(() => {});
}

類型 'iGetCalendarData' 的引數不可指派給類型 '{ [key: string]: string | number | number[] | string[]; }' 的參數。 類型 'string' 的索引簽章在類型 'iGetCalendarData' 中遺失。ts(2345)

這個問題的核心在於 iGetCalendarData 類型與 formatToURLParams 函數所期望的參數類型不匹配。具體來說,formatToURLParams 函數期望接收一個物件,該物件的屬性值可以是 number、string、number[] 或 string[]。然而,iGetCalendarData 類型的定義並不符合這個要求。

這個函數的目的是將一個物件轉換為 URL 查詢參數。它遍歷物件的每個鍵,並將其值轉換為字串後添加到 URLSearchParams 中。

問題出在 iGetCalendarData 類型的定義上。假設 iGetCalendarData 類型如下:

ts
interface iGetCalendarData {
    // 假設有一些屬性
    date: string;
    events: number[];
    // 其他屬性...
}

這個類型缺少一個索引簽章,這意味著它不能被用作 formatToURLParams 函數的參數。

要解決這個問題,我們可以為 iGetCalendarData 添加一個索引簽章,使其符合 formatToURLParams 的參數要求:

ts
interface iGetCalendarData {
    [key: string]: string | number | number[] | string[];
    date: string;
    events: number[];
    // 其他屬性...
}

這樣,iGetCalendarData 類型就可以被用作 formatToURLParams 函數的參數了。

希望這個解釋能幫助你理解並解決這個問題。如果有其他問題,請隨時告訴我。

Released under the MIT License.