我有這樣的事情:
interface Options {
// ...
f: (a: number, ...rest: any[]) => number[];
}
數百個檔案使用該介面,有些檔案像這樣使用它(人為的例子):
const options: Options = {
// ...
f(a, b) {
console.log(b);
return [a];
}
}
其他一些檔案像這樣使用它:
const options: Options = {
// ...
f(a) {
return [a];
}
}
我想修改介面以鍵入檢查rest引數,而不必修改使用它的所有檔案。
我做了一些測驗,我知道我可以rest通過以下方式輸入函式的引數:
// Works like a charm!
function f<T extends unknown[]>(n: number, ...rest: T) {
return [n, ...rest];
}
const a = f(1)
const b = f(1, {"c": "d"});
但是當試圖在這樣的介面上實作它時:
interface Options {
// ...
f: <T extends unknown[]>(a: number, ...rest: T) => number[];
}
我收到一個 TS 錯誤:
const opt1: Options = {
// TS Error!
f(a, b) {
console.log(b);
return [a];
}
}
const opt2: Options = {
// TS Error!
f(a) {
return [a];
}
}
這是一個帶有上述示例和錯誤的操場,我還沒有弄清楚如何解決。
關于如何實作這一目標的任何想法?
uj5u.com熱心網友回復:
界面上的這種變化應該可以解決編譯器錯誤,并允許您保留其他代碼原樣:
interface Opt<T extends unknown[] = unknown[]> {
f: (a: number, ...rest: T) => number[];
}
您的游樂場代碼,已更新
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368789.html
