我就是不明白。
我有这个界面。
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)
那我做错了什么?以及如何纠正?
谢谢
答案 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.parse
。 MDN 您的用例是什么?当然,有更好的方法来实现您的意图。