【问题标题】:How to type plain object as having strings for keys如何将普通对象键入为具有键的字符串
【发布时间】:2020-07-23 10:30:56
【问题描述】:

我有什么办法可以告诉这段代码k 是一个字符串,我认为输入V 就足够了吗?

function example <V extends { [key: string]: any }>(value: V, k: keyof V ): string { 
    return k;
}

我不想在这里投射任何东西,这个例子,是的,这是可能的,但在我的其他情况下,我只是想让 TS 知道它是一个字符串。

如果键是数字,我预计会出现类型错误,但这是有效的:

example({ 1: true }, 1)

【问题讨论】:

  • 我认为你不能这样做,因为 Typescript 假定每个对象键总是转换为字符串,这就是它没有显示错误的原因。基于这个假设,并且索引类型只能是数字 |您可以在函数中使用的字符串并从它返回 k.toString() 表达式。

标签: typescript


【解决方案1】:

答案

k: keyof V & string

解释

V extends { [key: string]: any } 真正的意思是……任何对象至少有一个string 类型的属性。这意味着keyof V 实际上等同于PropertyKey。这就是为什么我们需要将其中的任何键类型与string 类型相交。

所以以下内容将是有效的:

(1)

let value: { [key: string]: any } = {
    abc: 'AaBbCc',
    [Symbol()]: 123,
};

(2)

value: { [key: string]: any } = {}; // Object.prototype.hasOwnProperty, for eg.

无效的是:

(1)

let value: { [key: string]: any } = undefined;

(2)

let value: { [key: string]: any } = null;

其他注意事项

对于映射到简单值的简单类型,请考虑 Record(如果您的 TypeScript 版本)允许。例如:Record&lt;string, any&gt;.

如果您不是要将k 参数限制为string,以及返回值,请考虑内置类型PropertyKey,它实际上是string | number | symbol,或者将您的合同重写为等效的的……

function example <V, K extends keyof V>(value: V, k: K ): K { 
    return k;
}

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多