“空合并” TS友好功能

时间:2019-01-09 20:32:00

标签: javascript typescript

我正在尝试在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) {
  ...

1 个答案:

答案 0 :(得分:1)

当前,在TypeScript中无法像您要实现的那样表达深层的类型路径。 GitHub问题discussing possible workarounds与您的相似。还有一个suggesting the "pathof" keyword提案可以解决这个确切的问题。

与此同时,似乎您需要像在编辑中所做的那样,将类型完全定义为X级。