You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用Dart泛型实现:输入可选则返回对应可选类型的函数?

用Dart泛型合并日期转Timestamp函数

当然可以!借助Dart的泛型和可空类型系统,你能把这两个函数合并成一个,让它自动根据输入的可空性返回对应类型的结果。

泛型函数实现方案

下面是合并后的函数,它同时支持非空和可空的DateTime输入,并返回匹配可空性的Timestamp:

static R dateToTimestamp<R, T extends DateTime?>(T dateTime) {
  if (dateTime == null) {
    return null as R;
  }
  return Timestamp.fromDate(dateTime) as R;
}

使用方式

  • 输入非空DateTime时,指定返回类型为Timestamp:

    Timestamp timestamp = dateToTimestamp<Timestamp>(DateTime.now());
    
  • 输入可空DateTime或null时,指定返回类型为Timestamp?:

    DateTime? nullableDate = DateTime.now();
    Timestamp? nullableTimestamp = dateToTimestamp<Timestamp?>(nullableDate);
    
    // 直接传入null的情况
    Timestamp? nullTimestamp = dateToTimestamp<Timestamp?>(null);
    

更优雅的扩展方案

如果不局限于单个函数,Dart的扩展语法能实现更简洁的调用体验,无需显式指定泛型参数:

extension DateTimeToTimestamp on DateTime {
  Timestamp toTimestamp() => Timestamp.fromDate(this);
}

extension NullableDateTimeToTimestamp on DateTime? {
  Timestamp? toTimestamp() => this?.toTimestamp();
}

使用时直接调用扩展方法:

// 非空输入
Timestamp ts = DateTime.now().toTimestamp();

// 可空输入
DateTime? nullableDt = DateTime.now();
Timestamp? nullableTs = nullableDt.toTimestamp();

内容的提问来源于stack exchange,提问作者CoocooFroggy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:43:18