Typescript:从实现发出具有不同类型的声明文件?

Typescript:从实现发出具有不同类型的声明文件?,typescript,typescript-declarations,Typescript,Typescript Declarations,是否可以指示TypeScript编译器发出与实现中使用的类型不同的声明文件?例如: // source brewery.ts function brewBeer(name: unknown): Beer { ... } // emitted brewery.d.ts declare function brewBeer(name: string): Beer; “你为什么要这样?” 我正在用TypeScript编写一个库,我希望它也能用于非TypeScript项目。因此,我在运行时检查传递给公

是否可以指示TypeScript编译器发出与实现中使用的类型不同的声明文件?例如:

// source brewery.ts
function brewBeer(name: unknown): Beer { ... }

// emitted brewery.d.ts
declare function brewBeer(name: string): Beer;
“你为什么要这样?” 我正在用TypeScript编写一个库,我希望它也能用于非TypeScript项目。因此,我在运行时检查传递给公开函数的参数的有效性,如下所示:

export function brewBeer(name: string): Beer {
  if (typeof name !== 'string') {
    throw new TypeError(`'${name}' is not a beer name.`);
  }
  // Continue brewing...
}
// brewery.d.ts
declare function brewBeer(name: unknown): Beer;
这种方法是可用的,但并不完美:

  • 当传递了不正确类型的参数时,我无法对行为进行单元测试,因为测试文件也在TypeScript中,当不满足类型约束时,测试甚至不会运行:

    TS2345:类型为“number”的参数不能分配给类型为“string”的参数

  • 当然,编译器不会在编译时强制验证参数

  • 乍一看,这两个问题都可以用top类型解决:

  • 我可以在测试中传递任何类型的参数来评估运行时行为
  • 编译器通过在使用函数参数之前强制函数参数的断言来提供帮助
  • 但是,这种方法也有缺陷,因为发出的声明如下所示:

    export function brewBeer(name: string): Beer {
      if (typeof name !== 'string') {
        throw new TypeError(`'${name}' is not a beer name.`);
      }
      // Continue brewing...
    }
    
    // brewery.d.ts
    declare function brewBeer(name: unknown): Beer;
    
    这在使用TypeScript的项目中几乎没有用处

    那么,有没有一种方法可以使用
    unknown
    并仍然使用“正确”类型发出声明文件,而不用手动更正它们

    是否可以指示TypeScript编译器发出与实现中使用的类型不同的声明文件

    答案很简单:没有

    是否可以指示TypeScript编译器发出与实现中使用的类型不同的声明文件


    简单回答:否。

    在测试中使用
    任何
    强制转换或
    /@ts忽略

    brewBeer(42);
    

    由于
    @ts ignore
    会影响整行(例如,您可能会拼写错误
    brewBeer
    ),我更喜欢
    any
    方法。

    在测试中使用
    any
    强制转换或
    /@ts ignore

    brewBeer(42);
    
    由于
    @ts ignore
    会影响整行(例如,您可能会拼写错误
    brewBeer
    ),因此我更喜欢
    any
    方法