簡體   English   中英

通用高階 function 參數類型

[英]Generic higher order function parameter type

使用通用 function 參數創建 function 時,有沒有辦法防止參數使用不當?

感知到的標准案例將 function 鍵入為“any function whatever”:

const rip = <T extends (...args: any[]) => any>(f: T) => f('invalid');
rip((a: number) => a.toFixed(2)); // oops

鑒於any是一個 boo-doo 並使所有東西都成為雙變量,我嘗試了以下方法,但它仍然沒有考慮參數的數量:

const rip2 = <T extends (...args: readonly never[]) => unknown>(f: T) => f();
rip2((a: number) => a.toFixed(2)); // oops again

以前可能有人問過這個問題,但事實證明我很難找到它(關於“通用”和“高階”的類似主題太多)。


為了避免 XY 問題,問題的根源是編寫一個 function,它用檢查包裝函數。 這是我最初打算編寫它的方式:

declare const check: () => boolean;
const checked = <T extends (...args: any[]) => any>(f: T): (...args: Parameters<T>) => 
ReturnType<T> | undefined => (...args) => {
  if (check()) return;
  return f(...args); // `f('invalid')` would not cause an error
};
const g = checked((a: number) => a.toFixed(2));

它遇到同樣的問題。 在內部,function 是(...args: any[]) => any ,因此沒有檢查。 與上面類似,更嚴格的約束並不能完全解決問題(沒有參數仍然有效), readonly會導致錯誤,並且需要強制轉換:

declare const check: () => boolean;
const checked = <T extends (...args: /* readonly */ never[]) => unknown>(f: T): (...args: 
Parameters<T>) => ReturnType<T> | undefined => (...args) => {
  if (check()) return;
  return f(...args) as ReturnType<T>; // `f()` would not cause an error
};
const g = checked((a: number) => a.toFixed(2));

通過更具體的類型(即為 args 和返回類型創建一個單獨的通用類型,而不是從單個 function 類型推斷它們),TypeScript 能夠更好地推斷出如果 function 提供了不正確的參數。

declare const check: () => boolean;
const checked = <A extends any[], R>(f: (...args: A) => R): (...args: A) =>
    R | undefined => (...args) => {
        if (check()) return;
        return f(...args);
    };
const g = checked((a: number) => a.toFixed(2));

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM