将运算符重载添加到TypeScript

dwbf0jvd  于 2023-02-13  发布在  TypeScript
关注(0)|答案(1)|浏览(149)

我正在做一个需要大量向量和矩阵数学的项目,我希望有运算符重载。
有一些Babel插件(例如https://github.com/rob-blackbourn/jetblack-operator-overloading)支持JavaScript的运算符重载,但它们不能与TypeScript一起工作(或者至少它们不能与VS Code的TS语言服务器一起工作)。有一些变通方法使用// @ts-ignore,但我觉得它很难看,而且它消除了下一行类型检查的好处。
我想这样转换代码(其中abc是自定义对象):

a + b * c

变成这样:

a.__add__(b.__mul__(c))

例如,如果c对于函数__mul__是错误的类型,VS代码应该在原始行下划线,或者更好的是在符号c下划线。
我想在把代码传递给TS编译器之前可以先转换代码(这正是Babel插件所做的),但是VS代码总是显示错误(Operator '+' cannot be applied to types 'Custom' and 'Custom')。

所以我的问题是是否有一个项目可以实现上述行为?2如果没有,是否有可能以这种方式扩展TypeScript和/或TypeScript语言服务器?3如果有,请提供参考文献的链接以供进一步研究。

我还对JSX(React中使用的)如何使用全新的语法实现与TS的完全集成感兴趣,是否有其他项目以这种方式修改TS。

rdlzhqv9

rdlzhqv91#

Babel只适用于javascript代码,你需要编写一个自定义的typescript转换器,并在ts-loader上配置这个转换器。但是当ForkTsCheckerWebpackPlugin检查你的语法正确性时,仍然会出现一个问题。也许你必须关闭这个插件。
下面是创建空转换器的示例代码:

export function createTransformer (): ts.TransformerFactory<ts.SourceFile> {
  console.log("Hello, I am transformer just created");
  return (context: ts.TransformationContext) => {
    return (sourceFile: ts.SourceFile) => {
      function visit (node: ts.Node): ts.Node {
      return ts.visitNode(sourceFile, visit)
    }
  }
}
export default createTransformer

此外,您还必须配置您的项目,如果在vue中,vue.config.js将是:

const PipeTransformer = require('./pipe-transformer').default

module.exports = {
  // .... other configurations 
  chainWebpack: config => {
    // Can not use the ts-pipe-operator plugin, the babel plugin process only javascript not typescript.
    config.module.rule('ts').use('ts-loader').tap(options => {
      options.transpileOnly = true
      options.appendTsSuffixTo = ['\\.vue$']
      options.happyPackMode = false
      options.getCustomTransformers = () => ({
        before: [PipeTransformer()]
      })
      return options
    })
  }
}

相关问题