TypeScript Date.prototype.toJSON 的返回类型不正确,

yacmzcpb  于 4个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(63)

Bug报告

Date.prototype.toJSON() 可以根据规范 https://tc39.es/ecma262/#sec-date.prototype.tolocaledatestring 返回 stringnull。例如,new Date("").toJSON() 返回 null
目前,toJSON() 的返回类型被指定为字符串:
TypeScript/lib/lib.es5.d.ts
第879行
| | toJSON(key?: any): string; |

🕗 版本与回归信息

Typescript 4.2.3

💻 代码

new Date("").toJSON().slice(0,5);

在运行时产生错误,因为 new Date("").toJSON()null,但由于 new Date("").toJSON() 被假定为字符串,所以没有产生 TypeScript 错误。

🙂 预期行为

当任意字符串传递给 Date 时,TypeScript 应该警告可能的 null 值。然而,如果可以保证 Date 对象有效(例如 new Date()),则 toJSON() 的返回类型应该是 string

jdg4fx2g

jdg4fx2g1#

你是对的,但是做出这样的改变经常会让很多人因为没有得到很多回报而感到沮丧。(人们可能已经建立了其他验证系统来确保他们的日期是有效的,如果突然间他们不得不假装所有的日期可能有效,这对他们来说会非常痛苦。)这是我们希望听到的大量需求的第一种情况。

zdwk9cvp

zdwk9cvp2#

是否有支持的方法可以覆盖具有此类问题的基本类型? JSON.stringify() 是另一个罪犯。

zfycwa2u

zfycwa2u3#

遗憾的是,没有一种超级干净、简单的方法可以让内置类型比已经声明的更宽泛。这种事情让我想要重新考虑一下让人们可以选择使用“严格”版本的库文件的想法,这样我们就可以在不破坏世界的情况下进行这些更改。
我猜想最简单的选项是我建议编写一个 Package 函数,用于那些类型过于宽松的内置函数,并始终使用你的 Package 函数而不是内置函数(你可以通过ESLint规则来强制执行这一点):

export function dateToJSON(date: Date): string | null {
  return date.toJSON();
}
b4lqfgs4

b4lqfgs44#

我认为一个 --strictLibs 风格选项将是一个很好的折衷方案。目前是否有一个非规范类型列表,由于兼容性声明而没有被纠正?

8yparm6h

8yparm6h5#

没有列表,但最大的类别是每个 any 处于协变位置的都会变成 unknown 。我认为现在实现它的障碍实际上只是弄清楚如何自动化一切,以便我们实际上不需要维护两倍数量的库文件。特别是,DOM 库是从 IDL 文件生成的,因此将大量手动编辑插入到该过程中几乎是不可能的。改变 unknownany 或反之亦然很容易,但这个 string | null 返回类型是一个很好的例子,我们需要考虑一些事情。并非 每个 可空类型都应该在非严格库中变为非空。关于整个过程应该如何工作,有很多未解决的问题。

hivapdat

hivapdat6#

在$x_1^m_0^{n_1}x$和$x_1^m_1^{n_1}x$中,如果我们想要正确地返回类型,那么我们需要确保函数的返回类型与输入类型相匹配。例如,如果我们有一个函数,它的输入是一个数字,那么它的返回类型也应该是一个数字。这样可以确保我们的代码在运行时不会出现错误。

相关问题