【问题标题】:Typescript optional parameter not working - TS2554: Expected 2 arguments, but got 1打字稿可选参数不起作用 - TS2554:预期 2 个参数,但得到 1
【发布时间】:2021-08-05 06:03:48
【问题描述】:

我使用 Vue 和 Typescript 4.2.4 开发了一个应用程序。我不能在函数中使用可选参数。埃斯林特没有抱怨。我的代码在 TS Playground 上也能正常工作。这是一个示例:

const f = (a: object, b?: object): void => {
  console.log(a);
  if (b) {
    console.log(b);
  }
}

f({ lorem: 'ipsum' });
f({ foo: 'bar' }, { optional: 'test' });

每次我想编译我都会得到 TS2554: Expected 2 arguments, but got 1. 在第一次通话中。

是否有一些配置可以启用或我应该做的其他事情?我没有使用 Typescript 的经验。感谢您的帮助。

Laravel 组合:

const mix = require('laravel-mix');
const config = require('./webpack.config');

mix
  .webpackConfig(config)
  .setResourceRoot(config.output.publicPath)
  .disableNotifications()
  .ts('resources/assets/js/app.ts', 'public/js').vue().extract()
  .sass('resources/assets/sass/app.scss', 'public/css').sourceMaps()
  .copyDirectory('node_modules/layout/images/', 'public/images')
  .copyDirectory('node_modules/layout/icons/', 'public/icons')
  .version();

用于混合的 Webpack 配置

const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const path = require('path');

module.exports = {
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: { esModule: true },
      },
      {
        test: /\.ts$/,
        exclude: /node_modules/,
        loader: 'ts-loader',
        options: { appendTsSuffixTo: [/\.vue$/] },
      },
    ],
  },
  output: {
    publicPath: `/${process.env.APP_ALIAS}/` || '/',
    chunkFilename: 'chunks/[name].js?id=[chunkhash]',
  },
  plugins: [
    new CleanWebpackPlugin({
      cleanOnceBeforeBuildPatterns: ['**/*', '!.htaccess', '!index.php', '!robots.txt'],
    }),
  ],
  resolve: {
    alias: {
      '@': path.resolve('resources/assets/js'),
    },
  },
};

tsconfig

{
    "compilerOptions": {
        "target": "es2015",
        "module": "esnext",
        "moduleResolution": "node",
        "allowSyntheticDefaultImports": true,
        "strict": true,
        "strictNullChecks": true,
        "strictPropertyInitialization": true,
        "noImplicitAny": false,
        "noImplicitReturns": false,
        "noImplicitThis": false,
        "noUnusedLocals": true,
        "importHelpers": true,
        "skipLibCheck": true,
        "allowUnusedLabels": false,
        "sourceMap": true,
        "esModuleInterop": true,
        "allowJs": true,
        "baseUrl": ".",
        "paths": {
            "@/*": ["resources/assets/js/*"],
        },
        "lib": ["esnext", "dom"]
    },
    "include": [
        "resources/assets/js/**/*"
    ],
    "exclude": [
        "node_modules",
    ]
}

编辑:

好的,我想我的 Laravel 项目中的 Typescript 不能正常工作。当我将配置更改为:

"noImplicitAny": true,
"noImplicitReturns": true,

我的游乐场代码导致另一个错误:

./resources/assets/js/app.ts 6:11-12
[tsl] ERROR in D:\Dev\Laravel\processes\resources\assets\js\app.ts(6,12)
      TS7006: Parameter 'a' implicitly has an 'any' type.

ERROR in D:\Dev\Laravel\processes\resources\assets\js\app.ts
./resources/assets/js/app.ts 6:14-15
[tsl] ERROR in D:\Dev\Laravel\processes\resources\assets\js\app.ts(6,15)
      TS7006: Parameter 'b' implicitly has an 'any' type.

ERROR in D:\Dev\Laravel\processes\resources\assets\js\app.ts
./resources/assets/js/app.ts 12:0-21
[tsl] ERROR in D:\Dev\Laravel\processes\resources\assets\js\app.ts(12,1)
      TS2554: Expected 2 arguments, but got 1.

如您所见,函数和参数定义了它们的类型。 那里有什么问题?

【问题讨论】:

  • 我怀疑您编译的版本与您的编辑器使用的版本不同。
  • 感谢您的回答。这是一个 Laravel 项目,我在其中使用 Vue 和 TS。 node_modules 中只有一个版本的 TS。我使用 Laravel Mix(webpack 包装器)来编译我的应用程序。
  • 难道 TS 也是全局安装的,编译使用的是那个版本的 TSC?如果没有,最好在编译过程中包含更多细节——正如你提到的 webpack。
  • 是的,我还检查了 npm 全局包。没有全局 Typescript。 Webpack 只抛出我在上面写的消息。
  • 你能发布你的 webpack 配置文件吗?

标签: laravel typescript


【解决方案1】:

好的,谢谢大家,我有办法了。我发现 ts-loader 和 vue-loader 的 webpack 配置会导致 Laravel Mix 出现一些问题。我刚刚从配置中删除了rules 部分,并让 Laravel Mix 完成了这项工作。我的游乐场代码现在可以正常工作了。

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 2023-03-11
    • 1970-01-01
    • 2019-10-21
    • 2021-03-13
    • 2018-11-24
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多