首页 > 解决方案 > 错误 ts(2322) 试图在 Typescript 中定义通用函数签名

问题描述

我正在尝试定义这样的接口:

interface ColumnGenerator {
  columnName: string;
  columnValuesAsArgs?: string[];
  generator: <T = any[], R = any>(...args: T extends any[] ? T : [T]) => R;
}

的值generator应该是一个函数,它接受任意数量的任何类型的参数(如果有的话),然后返回一些东西。

但是,当我做类似的事情时:

const generatedColumn: ColumnGenerator = {
  columnName: 'creation_date',
  generator: () => new Date()
}

编译器产生下一个错误:

Type 'Date' is not assignable to type 'R'.
  'R' could be instantiated with an arbitrary type which could be unrelated to 'Date'.

我对 Typescript 还很陌生,所以我不知道我在这里做错了什么。谁能给我一个解释?

标签: node.jstypescripttypescript-generics

解决方案


生成器的值应该是一个函数,它接受任意数量的任何类型的参数(如果有的话),然后返回一些东西。

您在此处描述的类型是(...args: any[]) => any. 该类型是一个函数,它接受任意数量的any类型参数 & 然后返回任何东西。

type ColumnGenerator = {
  columnName: string;
  columnValuesAsArgs?: string[];
  generator: (...args: any[]) => any;
}


const generatedColumn: ColumnGenerator = {
  columnName: 'creation_date',
  generator: () => new Date()
}

我不完全确定您要做什么,但是如果您想稍微限制一下,可以限制使ColumnGenerator类型通用并在使用时对其进行配置:

type ColumnGenerator<T = any> = {
  columnName: string;
  columnValuesAsArgs?: string[];
  generator: (...args: any[]) => T;
}

const generatedColumn: ColumnGenerator<Date> = {
  columnName: 'creation_date',
  generator: () => new Date(), // this will now error if `Date` isn't returned from this function
}


推荐阅读