首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有动态属性名称的Typescript

问具有动态属性名称的Typescript
EN

Stack Overflow用户
提问于 2019-09-25 06:49:57
回答 1查看 213关注 0票数 0

在typescript中,有没有办法通过修改另一个属性名来动态生成属性名?

我正在尝试为React高阶组件编写一些类型,用于修改传递给包装组件的属性。如果您为hoc配置了一个属性名称(例如,value),它也会从中生成一个属性名称(在本例中为defaultValue)。

Typescript playground上的部分工作代码示例。

理想情况下,尝试访问defaultValue时不会出现错误。

EN

回答 1

Stack Overflow用户

发布于 2021-02-01 06:35:28

当您问这个问题时,这是不可能的,但现在随着typescript版本4.1中Template Literal Types的引入,这是可能的。

我们定义了一个从字符串文字"name“映射到其对应的"defaultName”的类型。

代码语言:javascript
复制
type DefaultName<PropName extends string> = `default${Capitalize<PropName>}`

我们声明Props应该同时具有属性值和默认值。

代码语言:javascript
复制
type Props<PropName extends string, Value = boolean> = {
    [K in PropName]: Value;
} & {
    [K in DefaultName<PropName>]: Value;
}

我将字符串的操作转移到一个单独的函数中,该函数为它创建的字符串文字断言正确的返回类型。(尽管从技术上讲,由于as Props<PropName>,hoc在没有此断言的情况下工作)。

代码语言:javascript
复制
function computeName<T extends string>(name: T): DefaultName<T> {
    const computedName = 'default' + name.slice(0, 1).toUpperCase() + name.slice(1);
    // need to assert the return type here, otherwise it's just `string`
    return computedName as DefaultName<T>;
}

你的hoc基本上是一样的。在调用fn时,我们仍然需要断言as Props<PropName>,否则对象会被解释为{ [x: string]: boolean; }。

代码语言:javascript
复制
function hoc<PropName extends string>(config: Config<PropName>, fn: Callback<PropName>) {
    fn({
        [config.name]: true,
        [computeName(config.name)]: false
    } as Props<PropName>);
}

魔术发生在test中,现在众所周知,obj有一个obj.defaultValue属性。这修复了您之前遇到的错误。

代码语言:javascript
复制
const test = hoc({ name: 'value' }, (obj) => {
    console.log(obj.value, obj.defaultValue); // no more errors
});

Typescript Playground Link

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

https://stackoverflow.com/questions/58089041

复制
相关文章

相似问题

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