'T' 类型的参数不能分配给 'string' 类型的参数
Argument of type 'T' is not assignable to parameter of type 'string'
我正在将 JS 代码重构为 TS(实际上 jsx/tsx),但我遇到了函数问题。
为了简化问题...假设我得到了这个函数“checkIt”,它可以接收一个字符串或数字作为参数和 returns 一个布尔值。
这是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'[=32= 类型的参数](或'number')。
我试过使用函数表达式 Union string | number(正如所解释的 here), different forms of writing Generics, and Overloads (like 但我无法让它工作。
这里有什么帮助吗??
谢谢!
使用类型转换怎么样?只是提示编译器:
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;
}
此外,Set
没有 include
方法。
为了使其完全合适,您首先要检查它是否真的是一个字符串。因为你使用联合 string|number
编译器知道如果 typeof id === 'string'
returns 为假,那么 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)
;
我正在将 JS 代码重构为 TS(实际上 jsx/tsx),但我遇到了函数问题。
为了简化问题...假设我得到了这个函数“checkIt”,它可以接收一个字符串或数字作为参数和 returns 一个布尔值。
这是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'[=32= 类型的参数](或'number')。
我试过使用函数表达式 Union string | number(正如所解释的 here), different forms of writing Generics, and Overloads (like
这里有什么帮助吗?? 谢谢!
使用类型转换怎么样?只是提示编译器:
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;
}
此外,Set
没有 include
方法。
为了使其完全合适,您首先要检查它是否真的是一个字符串。因为你使用联合 string|number
编译器知道如果 typeof id === 'string'
returns 为假,那么 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)
;