我想知道是否可以創建將替換兩個引數的動態型別,例如 inon: (eventName: EventName, callback: (data: any) => void) => void
用更接近 this 的東西,因此它可以從預定義集中on: (DynamicParams<EventName>) => void
提取型別并使用它而不是型別。callback's
any
我認為用一些代碼來解釋會更容易。
說,我有一組不同型別的事件:
const events = ['loaded', 'changed'];
type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType[number];
type EventName = ArrayElement<typeof events>
以及僅在發出特定通知時運行的功能;
const on = (eventName: EventName, callback: (data: any) => void) => {}
但我希望能夠將此函式與接受不同引數型別的回呼一起使用,而無需手動檢查型別且無需任何轉換,例如:
on('loaded', (list: Entry[]) => {
// do something with loaded array of elements;
}
on('changed', (index: number) => {
// do something with index of a changed entry;
}
有沒有辦法創建一個可以接受 EventName 并將特定型別回傳給給定事件的映射型別?
像這樣的東西:
const on(eventName: EventName, DynamicMethod<'eventName'> => void) => {}
const on(DynamicParams<'eventName'>) => {}
假設,我需要替換事件物件并在其位置創建一個型別,而不是:
type events = [
{
name: 'loaded',
method: (list: Entry[]) => void
},
{
name: 'changed',
method: (index: number) => void
}
]
但我不確定如何提取名稱值(不是值的型別)。
uj5u.com熱心網友回復:
如果您將事件名稱映射到其資料型別:
type EventMap = {
loaded: Entry[];
changed: number;
};
你可以on
通用:
const on = <E extends EventName>(eventName: E, callback: (data: EventMap[E]) => void) => {}
on('loaded', (list) => {
// ^? Entry[]
});
on('changed', (index) => {
// ^? number
});
操場
uj5u.com熱心網友回復:
有兩種方法可以使這項作業:
使用呼叫簽名:
interface OnEvent {
(eventName: 'loaded', callback: (list: Entry[]) => void): void;
(eventName: 'changed', callback: (index: number) => void): void;
}
const on: OnEvent = (eventName, callback) => {
// Choose how to register the event here...
}
或函式多載:
function on(eventName: 'loaded', callback: (list: Entry[]) => void): void;
function on(eventName: 'changed', callback: (index: number) => void): void;
function on(eventName: string, callback: (data: any) => void) {
// Choose how to register the event here...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/525812.html
標籤:打字稿