我有一個函式,它接受另一個函式作為引數。該引數是一個聯合型別的函式,也可能有或沒有引數。
type innerFn = () => void| (arg: string) => void | (arg: number) => void | (arg: {}) => void
function mainFn (innerFn: InnerFnType) {
function run(arg? : *any*) {
innerFn()
}
return run
}
我想知道run引數是否可以根據傳遞給mainFn的函式來繼承。
用例是:
const concreteInnerFn。InnerFnType = (arg: string){
do something
}
const run = mainFn(concreteInnerFn)
run("hello") // OK
run(25) // ERROR
run({hello: true}) //ERROR。
即如果我使用(arg: string) => void作為innerFn,當我試圖使用run()時,它應該要求一個字串型別的引數。
希望它足夠清楚
。uj5u.com熱心網友回復:
你可以這樣做:
type InnerFn =
| (() => void)
| ((arg: string) => void)
| ((arg: number) => void)
| ((arg: Record<string, unknown>) => void)
const main = <
Params extends Parameters<InnerFn> 。
>(fn: (...params: Params) => void) =>
(...args: Params) => fn( ...args)
/**。
*好的
*/
const result0 = main(() => { }) // ok
result0() // ok
const result1 = main((a: string) => { })// ok
result1('hello') // ok
const result2 = main((a: number) => { }) // ok
result2(42) // ok
const result3 = main((a: { age: number }) => { }) // ok
result3({ age: 42 })
/***。
*錯誤
*/
const result4 = main((a: Promise<number>) => { }) //預期的錯誤。
const result5 = main((a: number[]) => { }) //預期錯誤。
解釋
請不要使用{}作為一個型別,因為它是非常普遍的型別。在javascript和typescript中,所有東西都是一個物件。因此,{}不能作為一個約束條件使用。最好使用Record<string, unknown>來達到這樣的目的。
Parameters - 回傳一個由通過的函式的所有引陣列成的元組。
P.S. 我希望你不要介意我用箭頭函式而不是函式。我并不是說它更好,這只是一個風格問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324505.html
標籤:
