【问题标题】:Unable to assign function to type with generic parameter无法将函数分配给具有泛型参数的类型
【发布时间】:2021-04-19 04:01:35
【问题描述】:

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

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

Playground version.

Typescript 给出以下错误:

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

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

有一个相关问题具有相同的潜在问题,但答案是针对该问题的具体情况:Why is this TypeScript class implementing the interface not assignable to a generic constraint extending the interface?

【问题讨论】:

  • &lt;T&gt;(v: T) =&gt; string 表示可以消费任何东西并输出字符串的函数类型;你的函数只能使用一个字符串数组。
  • const s: &lt;T extends string[]&gt;(v: T) =&gt; string = (v: string[]) =&gt; (v[0] || 'x');

标签: typescript typescript-generics


【解决方案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 作为输入。

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 2010-10-04
    • 2021-07-02
    • 2022-01-21
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多