当前位置: 首页 > 知识库问答 >
问题:

具有T[K]约束的泛型排序函数

贲宏硕
2023-03-14

我正在学习TypeScript,目前正在尝试创建一个通用排序函数。

我有两个接口:

interface RefreshToken {
  client_icon?: string;
  client_id?: string;
  client_name?: string;
  created_at?: string;
  id?: string;
  is_current?: boolean;
  last_used_at?: string;
  last_used_ip?: string;
  type: "normal" | "long_lived_access_token";
}

interface PersistentNotification {
  created_at: string;
  message?: string;
  notification_id?: string;
  title: string;
  status?: "read" | "unread";
}

而我现在的函数看起来是这样的:

function SortByDateAscending<T, K extends keyof T>(values: T[], key: K) {
  const compare = (first: T, second: T) => {
    const timeA = first[key] ? new Date(first[key]) : 0;
    const timeB = second[key] ? new Date(second[key]) : 0;
    if (timeA < timeB) {
      return 1;
    }
    if (timeA > timeB) {
      return -1;
    }
    return 0;
  };
  return values.sort(compare);
}

上面的代码工作,但我得到警告:

没有与此调用匹配的重载。重载5中的1’(值:字符串|数字|日期):日期),导致以下错误。“T[K]”类型的参数不能分配给“string | number | Date”类型的参数。类型“T[keyof T]”不可分配给类型“string | number | Date”。类型“T[string]| T[number]| T[symbol]”不能分配给类型“string | number | Date”。类型“T[string]”不可分配给类型“string | number | Date”。类型“T[string]”不可分配给类型“Date”。类型“T[keyof T]”不可分配给类型“Date”。类型“T[K]”不可分配给类型“Date”。

不确定是否有方法添加约束,该约束将告诉T[K]必须是string | number | Date

这是我的测试项目:https://stackblitz.com/edit/typescript-yzualr我目前只传递字符串类型(一种是可选的),但也将使用日期,所以如果T[K]是日期,我不应该使用new Date

我希望避免对接口进行任何更改,当然也避免为每种类型创建单独的函数。

共有1个答案

丁豪
2023-03-14

您可以向排序方法传递一个方法,而不是键名

function sortByDateAscending<T>(
   values: T[], getDate: (val: T) => string | number | Date) {
   // ...
}

tokens = sortByDateAscending(tokens, token => token.last_used_at);

 类似资料:
  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 在过去一周左右的时间里,我一直在为Scala开发一个类型化、索引化的数组特性。我希望将该特征作为类型类提供,并允许库用户以他们喜欢的方式实现它。下面是一个示例,使用列表的列表来实现2D数组类型类: 这一切看起来都很好。我遇到的困难是,我希望将索引类型约束为一个已批准类型的列表(用户可以更改)。由于程序不是所有已批准类型的原始所有者,所以我想用一个typeclass来表示这些已批准类型,并让已批准类

  • 我在typescript中有以下泛型类 但是我不知道为什么得到这个错误Class'(匿名类)'不正确地扩展基类'列'。属性getValue的类型不兼容。类型'(值:数字)=

  • 我试图使这个JavaScript代码在Swift:k_combinations 到目前为止,我在斯威夫特有这样的记录: 但问题是我的功能打印 当它应该打印的时候 我做错了什么?我不擅长编码,我的javascript技能也不是很好,但javascript对我来说很有用,但在swift中我无法做到这一点。

  • 问题内容: 我想创建一个函数,该函数返回符合协议的对象,但是协议使用。给出以下玩具示例: 并且已扩展为符合,并且每个方法都实现了返回不同类型的方法。 现在,我想创建一个返回符合协议的对象的类。我不在乎课程是什么,只是我可以发送消息。当我尝试以下操作时,会生成一个编译错误: 错误: 协议“ HasAwesomeness”只能用作一般约束,因为它具有“自我”或相关类型要求 可以想像,其目的是返回或基于

  • 如果我要创建一个类,并且该类只接受特定类型的数据。我将继续使用泛型,在这个类中,我将继续将类型约束到Number类的上界。 因此,这个类只能使用Number类的类型或Number的子类(整型、双型、长型等)。 现在假设我有一个这些类型的数组,我希望比较数组中的值。所以这个类只包含这些允许的数据类型的数组,我们希望只比较这些类型。 我们可以通过使用包含compareTo方法的comparable接口