【问题标题】:Cannot find name 'Many' - Upgrading to TypeScript 3.1.6找不到名称“许多”-升级到 TypeScript 3.1.6
【发布时间】:2019-10-26 13:57:08
【问题描述】:

我最近将我的 Angular 项目从 6 升级到 7,我遇到了 lodash(v4.7.11) 提供的 orderBy 函数的问题。

我将字符串传递给orderBy的第三个参数时的错误是

'string' 类型的参数不能分配给Many<boolean | "desc" | "asc"> 类型的参数。

我的排序变量被命名为sort,我尝试将类型声明为sort: Many<boolean | "desc" | "asc">,然后我得到了错误

找不到名称“许多”

我该如何解决这个问题?

我的打字稿版本是 3.1.6。

【问题讨论】:

    标签: angular typescript lodash typescript3.0


    【解决方案1】:

    这里的一些答案是事实,但它并没有为我解决问题。我的情况有点棘手。

    这是我正在使用的确切代码行

    this.actions = _orderBy(this.actions, columnName, (this.sort.dir || this.defaultSort.dir))

    上面提到的 typescript 在编译期间抛出错误的地方。

    现在,我应该在问题中提到这一点,我不是直接传递 ascdesc,而是一个计算结果为其中之一的表达式。

    我只需要执行以下操作即可使其正常工作

    [(this.sort.dir || this.defaultSort.dir) === 'asc' ? 'asc' : 'desc']

    或 Avin 建议的更好版本

    (this.sort.dir || this.defaultSort.dir) as ('asc' | 'desc')

    因此,让解释器明白其中任何一个值都可能是唯一可能的输出。

    因此,对于任何人,大多数人来说,如果要传递一个字符串变量,该变量将具有这两个值中的任何一个,都可以按照这个小技巧来使事情正常进行。

    【讨论】:

    • 你不能将this.sort.dirthis.defaultSort.dir 的类型限制为'asc' | 'desc' 如果条件像(this.sort.dir || this.defaultSort.dir) as ('asc' | 'desc') 这样的条件,您可以使用类型断言而不是运行时,但要限制起源types 是更好的解决方案。
    • 谢谢,我试试看
    【解决方案2】:

    顾名思义,Many 类型需要 array of values。使用[ "desc" ]

    编辑:在进一步检查类型定义时,Many 允许数组和单个值。 Many<T> = T | ReadOnlyArray<T> 工作示例:

    orderBy([ { name: 'john' }, { name: 'kate' }], [ 'name' ],  'asc')
    orderBy([ { name: 'john' }, { name: 'kate' }], [ 'name' ],  [ 'asc' ])
    

    【讨论】:

    • 我收到Argument of type 'string[]' is not assignable to parameter of type 'Many<boolean | "desc" | "asc">'.
    • 那是不可能的。我添加了经过测试的示例。你在传递一个可变数组吗?它必须是恒定的。
    • 它不是一个可变数组,而是数组中的元素,它是一个字符串,是可变的并且只在运行时显示值。
    • 同样的事情 xD,你应该将字符串的类型限制为'asc' | 'desc'
    猜你喜欢
    • 2019-05-02
    • 2017-08-23
    • 2016-05-23
    • 2016-01-24
    • 2016-11-05
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多