我有以下代碼:
const someCollection = {};
/**
* @param id
* @param callback The callback will be given an object with keys `a1` (of type "string") and `a2` (of type "number").
*/
const addSomething = (id, callback) => {
someCollection[id] = { callback };
};
const getSomething = (id) => {
return someCollection[id];
};
addSomething("someId", ({ arg1, arg2 }) => {
console.log(arg1, arg2);
});
const something = getSomething("someId");
something.callback({ arg1: "hey", arg2: 2 });
如果你看一下addSomething關于callbackparam的評論,它說它想要接收一個帶有兩個引數的回呼,形狀為: arg1: string, arg2: number,與 一起id,這形成了我們集合中的一個專案。請注意,我們將回呼callback放在我們集合中的索引下。讓我們繼續,addSomething一旦我們檢索并列印所有內容,您就可以告訴它一切正常。我們的輸出應該是hey, 2. 好吧,讓我們在 TS 中寫這個:
const someCollection: { [index: string]: any } = {};
type CallbackType = {
new(
a1: string,
a2: number
): void
};
function addSomething(id: string, callback: CallbackType): void {
console.log( `${type.a1} ${type.a2}`);
}
addSomething('someId', ({a1: 'hey', a2: 2 }))
好吧,它不起作用。我可以告訴代碼是錯誤的,我只是不知道如何修復它。第一個提示是 TS 可能不知道如何處理“命名引數”,當 I 時addSomething,我實際上只是傳遞一個帶有物件的函式,作為它的一個單一引數。第二個提示是那callback只是……嗯,呃……不確定?它肯定不是一個函式。
簡而言之,我希望任何傳遞回呼的人都addSomething遵守CallbackType型別規則arg1并arg2分別使用正確的型別傳遞命名引數。
我在這里不明白什么?
uj5u.com熱心網友回復:
這是一個解決方案:
interface Something {
callback: SomethingCallback
}
type SomethingCallback = (obj: {arg1: string, arg2: number}) => void;
const someCollection: { [id: string]: Something } = {};
const addSomething = (id: string, callback: SomethingCallback) => {
someCollection[id] = { callback };
};
const getSomething = (id: string) => {
return someCollection[id];
};
addSomething("someId", ({ arg1, arg2 }) => {
console.log(arg1, arg2);
});
const something = getSomething("someId");
something.callback({ arg1: "hey", arg2: 2 });
一個解釋
首先,我們宣告我們需要的型別。Something將存盤在集合中的介面。這是一個包含鍵callback和型別值的物件SomethingCallback。
interface Something {
callback: SomethingCallback
}
該型別SomethingCallback表示一個接受一個引數的函式。該引數必須包含 2arg1個型別為string和arg2型別的鍵number:
type SomethingCallback = (obj: {arg1: string, arg2: number}) => void;
下面是如何宣告someCollection. 它是用作字典的物件。在 TS 中,這種模式稱為索引簽名:
const someCollection: { [id: string]: Something } = {};
然后,您所要做的就是使用型別作為注釋addSomething和getSomething引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/387151.html
標籤:打字稿
