打字稿:推断嵌套 keyof 属性的类型

Red*_*cer 6 type-inference typescript keyof

我想定义一个数组类型,它必须包含给定类型的嵌套属性名称链。

假设我有一个类型:

    type Foo = {
        outer: {
            inner: any;
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我想定义一个包含 2 个元素的 Array 类型:

type PropertyList<T, K1 extends keyof T, K2 extends keyof T[K1]> = [K1, K2];
Run Code Online (Sandbox Code Playgroud)

我想像这样使用它:

let myList:PropertyList<Foo> = ["outer", "inner"]
Run Code Online (Sandbox Code Playgroud)

所以我希望编译器检查包含的 2 个属性名称是否是 Foo 的嵌套属性名称。

但是我不能只用 1 个泛型参数定义 PropertyList,然后我收到这个错误:

TS2314: Generic type 'PropertyList' requires 3 type argument(s)
Run Code Online (Sandbox Code Playgroud)

知道如何推断嵌套的 keyof 类型而不必指定它们吗?

Tao*_*Tao 2

编辑

我想我误解了你的问题并且认为这不可能(还)。也许可以通过条件类型的类型推断来推断位置类型,条件类型将包含在即将发布的 TypeScript 2.8 版本中。

我将在下面留下原始答案以防万一。


类型参数可以有默认值:

type PropertyList<T, K1 extends keyof T = keyof T, K2 extends keyof T[K1] = keyof T[K1]> = [K1, K2];
Run Code Online (Sandbox Code Playgroud)

K1但也许在你的情况下,不指定andK2作为类型参数更有意义:

type PropertyList<T> = [keyof T, keyof T[keyof T]];
Run Code Online (Sandbox Code Playgroud)