首页 > 解决方案 > 无法将函数分配给具有泛型参数的类型

问题描述

我有一个问题归结为尝试将具有特定参数类型的函数分配给期望具有泛型类型的函数的变量:

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

游乐场版

打字稿给出以下错误:

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

这个错误对我来说没有多大意义,因为它似乎string[]是用于泛型的完全合理的类型T

有一个相关的问题具有相同的潜在问题,但答案是针对该问题中的情况的:为什么这个实现接口的 TypeScript 类不能分配给扩展接口的通用约束?

标签: typescripttypescript-generics

解决方案


正如 kaya3 所提到的,您正在尝试将采用特定类型的函数分配给string[]采用泛型类型的函数。相反,您可以做的是,使用通用签名定义一个类型。然后创建一个函数,该函数采用该通用签名的一个特定实例。像这样的东西:

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

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

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

推荐阅读