为什么 TypeScript 在 node-fetch 中接受 URL

问题描述

在 TypeScript 中,我可以执行以下操作:

const fetchUrl = async () => {
  let url: URL = new URL("http://example.com")
  url.searchParams.set("q","hello")
  url.searchParams.set("a","world!")
  return fetch(url)
}

我想知道为什么会接受这个,因为 fetch 的签名接受 RequestInfo = string | URLLike | Request 的联合类型作为第一个参数。我假设 URL-Type 匹配 URLLike 这只是一个接口

interface URLLike {
    href: string;
}

但是由于 URL 不是从 URLLike 扩展,所以它应该匹配对我来说似乎很奇怪。这是关于两种类型中都存在的 href 变量吗?

解决方法

TypeScript 使用结构类型而不是名义类型。这意味着只有形状很重要。 URLLike 被定义为具有字符串类型的 href 属性的形状,因此绝对具有字符串类型的 href 属性的任何类型都可以。

其他语言(如 Java)名义上是类型化的,这里的名称很重要。因此,只有明确表示实现 URLLike 的类型才是有效的。

你可以把它想象成编译时鸭子类型。