我正在尝试让一个“空合并函数”在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]
尽管这正是我第一次这么叫的!
救命!
[编辑]这很有效,但很难看!有人帮帮米耶
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) {
...