我正在尝试在TS中使用“空合并功能”。基本上get(obj, 'key1', 'key2', 'key3')
这就是我所拥有的:
const X = {
a: 42,
b: 'bar',
c: {
d: 'foo'
}
}
function get<T, K extends keyof T>(item: T, key: K, ...more: string[]): T[K] | null {
if (key in item) {
const out = item[key];
if (more.length) {
return get(out, more[0], ...more.slice(1));
} else {
return out;
}
} else {
return null;
}
}
const foo = get(X, 'c', 'd');
这可以在顶层使用,例如get(X, 'c')
,但由于某种原因我无法理解递归。无论我尝试什么,都会遇到各种TS错误,或多或少都说我无法将字符串强制转换为keyof T[K]
,尽管这正是我第一次调用它时所做的事情!
帮助!
[edit]如此有效,但AF丑陋!有人帮忙
function get<T, K extends keyof T>(item: T, key: K): T[K] | null;
function get<T, K extends keyof T, L extends keyof T[K]>(item: T, key1: K, key2: L): T[K][L] | null;
function get<T, K extends keyof T, L extends keyof T[K], M extends keyof T[K][L]>(item: T, key1: K, key2: L, key3: M): T[K][L][M] | null;
function get(obj, key, ...moreKeys) {
...
答案 0 :(得分:1)
当前,在TypeScript中无法像您要实现的那样表达深层的类型路径。 GitHub问题discussing possible workarounds与您的相似。还有一个suggesting the "pathof" keyword提案可以解决这个确切的问题。
与此同时,似乎您需要像在编辑中所做的那样,将类型完全定义为X级。