为什么 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
的类型才是有效的。
您可以将其视为编译时鸭子类型。
在 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
的类型才是有效的。
您可以将其视为编译时鸭子类型。