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

Why is TypeScript accepting an URL in node-fetch

在 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 的类型才是有效的。

您可以将其视为编译时鸭子类型。