首页 > 解决方案 > 使用点符号正确键入对对象嵌套键的访问

问题描述

好的,所以我在这里有这个界面:


interface IConfig {
    git: {
        cloneMethod: 'ssh'|'https'
    },
    terminal: {
        level: 'log'|'etc',
        beforeEach: {
            consoleClear: boolean
        },
        consoleMode: 'extended' | 'simple'
    }
}

我想创建一个访问器函数,就像Rambda 的 path一样,但输入正确,在自动完成中显示所有可能的选项,并返回预期值。

我的函数的使用示例:

access('terminal.beforeEach.console.Clear') // 'log'|'etc'
access('git.cloneMethod') // 'ssh'|'https'

我认为这在 Typescript 4.1 中是可能的,所以我尝试了一些方法,最接近我想要的方法是:

type Join<A extends string, B> = B extends string ? `${A}.${B}` : A;

export interface IAccesor {
    <A extends keyof IConfig>(key: A): IConfig[A];
    <A extends keyof IConfig, B extends keyof IConfig[A]>(key: Join<A, B>): IConfig[A][B];
    <A extends keyof IConfig, B extends keyof IConfig[A], C extends keyof IConfig[A][B]>(key: Join<Join<A, B>, C>): IConfig[A][B][C];
}

但是出现了一些错误...


const accessor: IAccesor = {} as any;

accessor('git') // IConfig['git'];
accessor('git.cloneMethod') // 'https'|'ssh'
accessor('terminal') // IConfig['terminal'];
accessor('terminal.beforeEach.consoleClear') // Error
accessor('terminal.lev') // Error (expected)
accessor('terminal.level') // "log" | "etc"

我有点迷失了现在该做什么......

标签: typescript

解决方案


推荐阅读