微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“T”类型的参数不能分配给“字符串”类型的参数

如何解决“T”类型的参数不能分配给“字符串”类型的参数

我正在将 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,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 |数(如 here 所解释的)、泛型的不同书写形式和重载(例如 here,我就是无法让它工作。

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

解决方法

如何使用类型转换?只是为了提示编译器:

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,4]);

const checkIt = (id: string | number): boolean =>
  typeof id === 'string' ? FIRST_ROW.includes(id) : SECOND_ROW.has(id)
;

playground

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?