首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录问题--类型记录不能推断对象属性

类型记录问题--类型记录不能推断对象属性
EN

Stack Overflow用户
提问于 2022-06-16 08:50:15
回答 1查看 24关注 0票数 0

我对类型记录有困难,我试图动态地推断一个对象的属性。

看看下面的代码

代码语言:javascript
复制
const Actions = {
    globalUI: {
        openModal: 'openModal'
    }
}

type Param = keyof typeof Actions;
type T = <T, K extends keyof T>(action: T, key: K) => T[K];
const fn = (param: Param) => {

    const action = mapper(Actions, param);

    return action
}
const mapper:T = (action, name) => {
    return action[name]
}

const action = fn('globalUI');

如您所见,类型记录可以推断出全局UI属性。

但是,当我在Actions对象中放置附加属性时

类型记录不能推断对象属性

代码语言:javascript
复制
const Actions = {
    globalUI: {
        openModal: 'openModal'
    },
    LP: {
        addDirectory: 'addDirectory'
    }
}

type Param = keyof typeof Actions;
type T = <T, K extends keyof T>(action: T, key: K) => T[K];
const fn = (param: Param) => {

    const action = mapper(Actions, param);

    return action
}
const mapper:T = (action, name) => {
    return action[name]
}

const action = fn('globalUI');

我怎样才能做到这一点?请给出任何想法

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-16 12:25:26

您的mapper函数按预期工作:

代码语言:javascript
复制
type T = <T, K extends keyof T>(action: T, key: K) => T[K];

const mapper:T = (action, name) => {
    return action[name]
}

const action = mapper(Actions, 'globalUI');

action.openModel // works greak 

问题在于fn函数,它将联合推断为返回类型。在您的示例中使用{ openModal: string } | { addDirectory: string }

因此,您需要使用泛型来显化返回类型:

代码语言:javascript
复制
const fn = <S extends Param>(param: S): typeof Actions[S]  => {
    const action = mapper(Actions, param);
    return action
}

const action = fn('globalUI'); 

action.globalUI; // Ok now

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72643017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档