将本机获取主体网络流转换为节点流时打字稿错误

Daw*_*i67 11 node.js typescript fetch-api node-streams

包.json

{
  "type": "module",
  "dependencies": {
    "@types/node": "^18.6.5",
    "typescript": "^4.7.4"
  }
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2021",
    "module": "ESNext",
    "moduleResolution": "node",
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  }
}
Run Code Online (Sandbox Code Playgroud)

使用节点 v18.7.0,我尝试将从本机 fetch API 返回的网络流转换为节点流。我使用“node:stream”模块中的 Readable.fromWeb 方法。Typescript 返回类型检查错误,但代码使用 @ts-ignore 注释按预期工作。

类型错误

 Argument of type 'ReadableStream<Uint8Array>' is not assignable to parameter of type 'ReadableStream<any>'.
  Type 'ReadableStream<Uint8Array>' is missing the following properties from type 'ReadableStream<any>': values, [Symbol.asyncIterator]

const nodeStream = Readable.fromWeb(fetchRequest.body)
Run Code Online (Sandbox Code Playgroud)

源代码

 Argument of type 'ReadableStream<Uint8Array>' is not assignable to parameter of type 'ReadableStream<any>'.
  Type 'ReadableStream<Uint8Array>' is missing the following properties from type 'ReadableStream<any>': values, [Symbol.asyncIterator]

const nodeStream = Readable.fromWeb(fetchRequest.body)
Run Code Online (Sandbox Code Playgroud)

提取类型是否存在错误,或者我做错了什么?

这里是一个复制游乐场

Dim*_*ava 3

问题是你的获取不是nodejs获取,它是DOM获取
@types/NodeJS没有获取
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/60924#issuecomment-1236920407

这不是TheFetchYouAreLookingFor.jpg


你可以用以下方法解决这个问题

import type * as streamWeb from 'node:stream/web';
declare global {
  interface Response {
    readonly body: streamWeb.ReadableStream<Uint8Array> | null;
  }
}
Run Code Online (Sandbox Code Playgroud)

作为streamWeb.ReadableStream扩展ReadableStream

,或使用外部定义,如链接的线程中

declare global {
    export const {
        fetch,
        FormData,
        Headers,
        Request,
        Response
    }: typeof import('undici')
    export type {FormData, Headers, Request, RequestInit, Response} from 'undici'
}

export {}
Run Code Online (Sandbox Code Playgroud)