我正在尋找一種在不接收引數Parameter<F>時F不為泛型函式型別引數提供空陣列的方法。以下作業示例顯示了當前狀態
type A<F extends (...args: any[]) => any> = {
shouldPrintHello: boolean;
params: Parameters<F>;
};
const wrappingFunction = <F extends (...args: any[]) => any>(sentFunction: F, defaultParams: A<F>) => {
const innterFunction = (...args: Parameters<F>) => {
if (defaultParams.shouldPrintHello) console.log("hello");
sentFunction(args);
return;
};
const defaultValue = sentFunction(defaultParams);
return innterFunction;
};
const f1 = wrappingFunction(
(arg0: string) => {
return;
},
{ shouldPrintHello: true, params: ["defaultString"] }
);
const f2 = wrappingFunction(
() => {
return;
},
{ shouldPrintHello: true, params: [] }
);
f1("a string");
f2();
所需的(偽)代碼更改:
type A<F extends (...args: any[]) => any> = {
shouldPrintHello: boolean;
params: Parameters<F> === [] ? undefined : Parameters<F>;
};
const f2 = wrappingFunction(
() => {
return;
},
{ shouldPrintHello: true }
);
f2();
uj5u.com熱心網友回復:
當且僅當某些條件保持其值時,沒有內置方法可以表示屬性是可選的,因此,如果您想要這樣的型別,則必須自己將其撰寫為條件型別:
type OptionalParamsIfAllowedToBeEmpty<P> =
[] extends P ? { params?: P } : { params: P }
然后您可以將其與型別定義的其余部分相交:
type A<F extends (...args: any[]) => any> = {
shouldPrintHello: boolean;
} & OptionalParamsIfAllowedToBeEmpty<Parameters<F>>;
declare const wrappingFunction: <F extends (...args: any[]) => any>(
sentFunction: F,
defaultParams: A<F>) => (...args: Parameters<F>) => void
讓我們測驗一下。首先,讓我們確保它對于具有至少一個必需引數的函式的行為符合預期:
wrappingFunction(
(arg0: string) => {
return;
},
{ shouldPrintHello: true, params: ["defaultString"] }
);
wrappingFunction(
(arg0: string) => {
return;
},
{ shouldPrintHello: true } // error! missing params
);
看起來不錯,params不是可選的。然后讓我們測驗一下沒有任何引數的函式:
wrappingFunction(
() => {
return;
},
{ shouldPrintHello: true }
);
wrappingFunction(
() => {
return;
},
{ shouldPrintHello: true, params: [] } // okay
);
wrappingFunction(
() => {
return;
},
{ shouldPrintHello: true, params: undefined } // okay
);
wrappingFunction(
() => {
return;
},
{ shouldPrintHello: true, params: ["defaultString"] } // error
);
看起來也不錯;你可以省略params,或者傳入undefined一個空陣列[],但它不會讓你傳入錯誤的引數。最后,讓我們看看它是如何處理帶有可選引數的函式的:
function f(x?: string) { }
wrappingFunction(f, { shouldPrintHello: false }) // okay
wrappingFunction(f, { shouldPrintHello: false, params: ["abc"] }) // okay
這也是你想要的,我想。既然你可以打電話f(),你不應該被要求傳入params,wrappingFunction但既然你也可以打電話f("abc"),你應該被允許傳入paramsas ["abc"]。[] extends P這是簽到OptionalParamsIfAllowedToBeEmpty<P>和看似相似的簽到之間的一個重要區別P extends [];如果P是[x?: string],[] extends [x?: string]則為真,但[x?: string] extends []為假。
Playground 代碼鏈接
uj5u.com熱心網友回復:
不要害怕使用extends來檢查“平等”:
type A<F extends (...args: any[]) => any> = {
shouldPrintHello: boolean;
params: Parameters<F> extends [] ? undefined : Parameters<F>;
};
或者,您可以檢查長度:
params: Parameters<F>["length"] extends 0 ? undefined : Parameters<F>;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516373.html
標籤:打字稿仿制药
