网站搜索

typescript - 无法将函数分配给具有泛型参数的类型


我有一个问题,本质上是试图将一个具有特定参数类型的函数分配给一个期望具有通用类型的函数的变量:

const s: <T>(v: T)=>string 
  = (v: string[])=>(v[0]||'x');

游乐场版本。

TypeScript 给出以下错误:

类型 '(v: string[]) => string' 不能分配给类型 '(v: T) => string'。参数 'v' 和 'v' 的类型不兼容。类型 'T' 不能分配给类型 'string[]'。

这个错误对我来说没有太大意义,因为看起来 string[] 是用作泛型 T 的一个完全合理的类型。

有一个相关的问题也有相同的根本问题,但那里的答案是针对该问题的具体情况的:为什么这个实现了接口的 TypeScript 类不能分配给扩展该接口的泛型约束?

答案#1

正如 kaya3 提到的,你正在尝试将一个接受特定类型 string[] 的函数分配给一个接受泛型类型的函数。你可以改为定义一个具有泛型签名的类型。然后创建一个函数,该函数是该泛型签名的一个特定实例。类似这样:

type MyType<T> = (v: T) => string;
const s: MyType<string[]>  = (v: string[]) => v[0] || 'x' ;

如果你只有一种类型,这将足够:

const s  = (v: string[]) => v[0] || 'x' ;

答案#2

你正试图将一个接受字符串数组并返回字符串的函数,赋值给一个接受任意 T 并返回字符串的变量。一个接受字符串数组作为输入的函数不能接受任意 T 作为输入。