【问题标题】:Constant values as array element gives error作为数组元素的常量值会产生错误
【发布时间】:2018-11-20 14:13:05
【问题描述】:

我是Typescript 的新手。 我有这些枚举和常量变量:

enum VALUE_MAP = { value1 = 'value1', value2 = 'value2', value3 = 'value3' }
const SOME_CONSTANT = [VALUE_MAP.value1, VALUE_MAP.value2];

还有一个使用SOME_CONSTANT检查值是否存在的方法。

export const hasValue = (value: string) => SOME_CONSTANT.includes(value);

这给了我错误:

TS2345: Argument of type 'string' is not assignable to parameter of type 'VALUE_MAP'.

使用(value: VALUE_MAP) => 可以解决问题,但我不想这样做,或者我想知道为什么VALUE_MAP 被用作类型

有什么帮助吗?

【问题讨论】:

  • 我会在这种情况下使用枚举。
  • 澄清你的对象是否像这样const VALUE_MAP = { value1: 'valueA', value2: 'valueB', value3: 'valueC' }调用hasValue时你会传递value1valueA
  • 它是根据您声明 VALUE_MAP 的方式推断类型。我猜const VALUE_MAP: any = {...} 在这种情况下会解决这个问题,但这是一种解决方法.... enum 是按照@DanielA.White 评论的方式。
  • @DanielA.White 忘了提,但VALUE_MAP 是枚举。
  • @DanielA.White 感谢您的提示,将 VALUE_MAP 更改为 const 修复了错误。

标签: javascript reactjs typescript constants


【解决方案1】:

你应该使用:

export const hasValue = (value) => SOME_CONSTANT.includes(value);

没有string 作为参数。 如果你使用 Babel 插件,这将在转译期间剥离参数类型。

输入:

function foo(one: string, two: number): string {}

输出:

function foo(one, two) {}

因此,参数类型在 ES6 中无效。如果代码是使用 Babel 转译的(带有剥离插件),您可以使用它们。

【讨论】:

  • 这个问题被标记为TypeScript,所以我猜是使用了TypeScript编译器。
  • 删除one: string 中的字符串有效。但是如果在其他地方使用SOME_CONSTANT ,比如在渲染方法中,它会给出同样的错误。像SOME_CONSTANT.includes(this.props.value) 一样给出错误。
【解决方案2】:

如果您想使用 Array.includes,您需要以 ES2016 或更高版本为目标,因为它在 ECMAScript 5 中不存在。

例如,这个tsconfig.json 失败并出现您描述的错误:

{
    "compilerOptions": {
        "target": "ES5"
    }
}

而这个tsconfig.json 没有:

{
    "compilerOptions": {
        "target": "es2016"
    }
}

【讨论】:

  • 我在 VSCode 中有一个使用此配置的工作版本。你使用什么工具,你是如何编译的?
【解决方案3】:

在@Daniel A. White 之后,指出我应该使用enum。然后我得到了一点提示并更改了一些代码。 所以VALUE_MAP 已经是enum。我把它改成constant,它工作了。感谢大家的时间和建议。

现在没有出现错误。

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多