'Date | 类型的参数null' 不能分配给类型为 'string' 的参数

时间:2021-05-16 20:10:59

标签: javascript reactjs

我就是不明白。

我有这个界面。

export interface Activity {
  id: string;
  title: string;
  date: Date | null;
  description: string;
  category: string;
  city: string;
  venue: string;  
}

然后我有这个功能:

  get activitiesByDate(){

    return Array.from(this.activityRegistry.values()).sort((a, b) => 
      Date.parse(a.date) - Date.parse(b.date));
  }

但我仍然收到此错误:

Argument of type 'Date | null' is not assignable to parameter of type 'string'.
  Type 'null' is not assignable to type 'string'.ts(2345)

那我做错了什么?以及如何纠正?

谢谢

2 个答案:

答案 0 :(得分:1)

我认为你在这里得到的错误很好解释,但我会尽量解释得更好:

Javascript 的 Date.parse() 方法解析日期的字符串表示,最好在 MDN 上解释。

这意味着 Date.parse() 接受的参数类型必须是 string 类型。它还接受作为 javascript 中 Date (它是一个对象)的实例的参数。 Date.parse() 返回自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数

示例:

console.log(new Date() instance of Date); // true
console.log(Date.parse(new Date().toString())) // gives the right answer

console.log(Date.parse("01 Jan 1970 00:00:00 GMT")) // works properly

在这种情况下,打字稿告诉您的是,您不应该将类型可能为 Date 或 null 的值分配给需要 string 类型值的方法。

那么,你能做什么? 由于您知道 Date 上的变量 Activity 的类型可能是 Date | null

我建议你做这样的事情:

if(a.Date && b.Date) {
  Date.parse(a.date.toString()) - Date.parse(b.date.toString()));
}

答案 1 :(得分:1)

这是打字稿超级确保您的代码防弹的结果。在您的界面中,您已将 date 属性定义为可能的 null

date: Date | null;

这意味着在这段代码中:

Date.parse(a.date)

它正在检查两种可能性:

Date.parse(null)

Date.parse(<type Date>)

两者都失败了。 Date.parse 期待 string。为了让打字稿开心,

您需要确保 a.date 始终是一个字符串。这意味着您需要考虑 null 您需要将日期对象转换为字符串,同时在将日期对象转换为字符串时还要考虑 null细绳。这可以通过可选链接和无效合并来完成

Date.parse(a.date?.toDateString() ?? new Date().toDateString) // or whatever default value you want

但话虽如此,不推荐使用 Date.parseMDN 您的用例是什么?当然,有更好的方法来实现您的意图。