我想知道如何正确推断我的函数的第二个和第三个模板
假设一个简单的界面
interface ISome {
a: string;
b?: {
c: string;
};
}
关注作品
function pathBuilder<
K1 extends keyof ISome,
K2 extends keyof NonNullable<ISome[K1]>>(p: K1, p2?: K2) {
let res = String(p);
if (p2) { res += "." + p2; }
return res;
}
const pathTest = pathBuilder("b", "c"); // ---> "b.c" and intellisense works on parameters
但我需要通过指定另一种类型来概括该函数的工作(我不想传递对象实例来指定类型)
所以,以下不起作用
function pathBuilder<
T,
K1 extends keyof T,
K2 extends keyof NonNullable<T[K1]>>(p: K1, p2?: K2) {
let res = String(p);
if (p2) { res += "." + p2; }
return res;
}
const pathTest = pathBuilder<ISome>("b", "c"); // ERROR: Expected 3 type arguments, but got 1.ts(2558)
似乎函数的第二个和第三个模板参数不是从第一个参数推断出来的,但它应该是因为在第一种情况下,当我直接指定类型 T=ISome 时它起作用了。
我不确定是否有一些语言关键字可以使其工作,但模板应该完全适用:指定未知类型。
编辑
实际上我找到了这种方式,但需要额外的编码,如果可能的话我会避免
function pathBuilder<T>() {
return <
K1 extends keyof T,
K2 extends keyof NonNullable<T[K1]>>(p: K1, p2?: K2) => {
let res = String(p);
if (p2) { res += "." + p2; }
return res;
};
}
const pathTest = pathBuilder<ISome>()("b", "c");