【问题标题】:Argument of type 'T' is not assignable to parameter of type 'string'“T”类型的参数不能分配给“字符串”类型的参数
【发布时间】:2021-04-23 18:21:40
【问题描述】:

我正在将 JS 代码重构为 TS(实际上是 jsx/tsx),但我遇到了函数问题。

为了简化问题...假设我得到了这个函数“checkIt”,它可以接收一个字符串或数字作为参数并返回一个布尔值。

这是JS函数:

const FIRST_ROW = 'Initial';
const SECOND_ROW = new Set([1, 2, 3, 4]);

const checkIt = id => {
if (FIRST_ROW.includes(id) || SECOND_ROW.includes(id)) {
    return true;
  }
  return false;
}

这是我的试验......(因为我正在学习 TS,我喜欢声明推断变量是一致的)

const FIRST_ROW: string = 'Initial';
const SECOND_ROW: Set<number> = new Set([1, 2, 3, 4]);

const checkIt = <T,>(id: T): boolean => {
  if (FIRST_ROW.includes(id) || SECOND_ROW.includes(id)) {
    return true;
  }
  return false;
}

这让我在函数内的“id”引用上出现错误:'T' 类型的参数不可分配给'string' 类型的参数(或'number' )。 我试过使用函数表达式,Union string | number(如here 解释的那样)、不同形式的泛型编写和重载(如here,我就是无法让它工作。

这里有什么帮助吗? 谢谢!

【问题讨论】:

    标签: javascript typescript typescript-generics react-tsx


    【解决方案1】:

    使用类型转换怎么样?只是提示编译器:

    const FIRST_ROW: string = 'Initial';
    const SECOND_ROW: Set<number> = new Set([1, 2, 3, 4]);
    
    const checkIt = (id: string | number): boolean => {
      if (FIRST_ROW.includes(id as string) || SECOND_ROW.has(id as number)) {
        return true;
      }
      return false;
    }
    

    playground

    另外,Set 没有 include 方法。

    为了使它完全合适,首先检查它是否真的是一个字符串。因为你使用联合string|number,编译器知道如果typeof id === 'string'返回false,那么id必须是number,所以不需要强制转换:

    const FIRST_ROW: string = 'Initial';
    const SECOND_ROW: Set<number> = new Set([1, 2, 3, 4]);
    
    const checkIt = (id: string | number): boolean =>
      typeof id === 'string' ? FIRST_ROW.includes(id) : SECOND_ROW.has(id)
    ;
    

    playground

    【讨论】:

    • 太棒了!谢谢。关于 Set.includes 写在这里时出错。 ?
    • @Poul 有一个问题......在 TS 中使用大量 typeof 来限制类型是否正常?我在文档上看到了它的用法,但这对我来说听起来并不自然,因为看起来我的代码中溢出了更多的文本和逻辑,而这些可以通过另一种更简单和优雅的方式来避免......
    • @Анна 如果你有一个 union 参数,那么你一定要在做之前检查:)
    猜你喜欢
    • 1970-01-01
    • 2019-07-27
    • 2021-10-21
    • 2021-10-13
    • 2018-06-24
    • 2020-08-19
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多