TypeScript 无法增强函数重载,因为该函数是通过export {}导出的,

r3i60tvu  于 2个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(27)

🔎 搜索词

TS2383, 函数重载,模块增强

🕗 版本与回归信息

  • 这会导致崩溃
  • 在3.2.4之前,你会得到 "TS2484: 导出声明与 'get' 的导出声明冲突。"

⏯ Playground链接

https://github.com/eps1lon/tsc-augment-overload

💻 代码

// library.d.ts
declare function get(): string;
declare function set(value: string): void;

export { get, set };

// app.d.ts
import "library";

declare module "library" {
  function get(): string | null;
}

// index.ts
import { get, set } from "library";

// module augmentation did work
const value = get();
//    ^? string | null
// @ts-expect-error Argument of type 'string | null' is not assignable to parameter of type 'string'.
set(value);

🙁 实际行为

$ yarn tsc --skipLibCheck false
app.d.ts:4:12 - error TS2383: Overload signatures must all be exported or non-exported.

4   function get(): string | null;
             ~~~

Found 1 error in app.d.ts:4

🙂 预期行为

由于模块增强似乎已经起作用,没有错误。

关于问题的附加信息

作为解决方法,我们可以切换到

-function get(): string
+export function get(): string
-export {get}

尽管这似乎像是TypeScript强制执行某种代码风格。一些团队更喜欢写一个单一的 export {} 语句。

g9icjywg

g9icjywg1#

我猜想这个论点是,这应该可以工作,因为原始库中写的是export { get }而不是单独导出函数。但那是一个实现细节——它不应该能够影响增强文件如何被允许写入。

kzipqqlq

kzipqqlq2#

我猜想这个论点是,这应该可以工作,因为原始库写的是导出 { get } 而不是单独导出函数。但那是一个实现细节——它不应该能够影响如何允许写入增强文件。
如果我们可以在模块增强中实际写出 export {} ,我会觉得没问题,但我们不能。我们得到了这两个错误:

  1. 在模块增强中不允许有导出和导出赋值。(2666)
  2. 导出声明与 'X' 的导出声明冲突。(2484)
import * as React from 'react'

declare module 'react' {
  function useId(): string | null

  export {useId}
}

Playground Link

wfsdck30

wfsdck303#

@eps1lon 我也遇到了这个问题(Exports and export assignments are not permitted in module augmentations.),当想要从一个模块重新导出类型到全局时。

// utils.d.ts
declare module "caido:utils" {
  export class Body {
    constructor(data: string | Array<number> | Uint8Array);
  }
}

// typing.d.ts
import type {
  Body as _Body,
} from "caido:utils";

declare global {
  export { _Body as Body };
}

相关问题