TS2322: Type 'number' is not assignable to type 'SSRSlot'
Expected Behaviour
The error in the pic should not be shown.
Actual Behaviour
when using dynamic slot with v-for with vue components, i'm getting the following errors:
error in /home/michael/Development/app/symfony-demo-vue-bug/assets/vue/components/Parent.vue.ts 8:00:25 AM
[tsl] ERROR in /home/michael/Development/app/symfony-demo-vue-bug/assets/vue/components/Parent.vue.ts(5,93) TS2322: Type 'number' is not assignable to type 'SSRSlot'.
error in /home/michael/Development/app/symfony-demo-vue-bug/assets/vue/components/Parent.vue.ts 8:00:25 AM
[tsl] ERROR in /home/michael/Development/app/symfony-demo-vue-bug/assets/vue/components/Parent.vue.ts(6,37)
TS2769: No overload matches this call.
The last overload gave the following error.
Argument of type '<K extends string | number | symbol>(slotName: any) => { name: any; fn: Function; }' is not assignable to parameter of type '<K extends string | number | symbol>(value: any, key: K, index: number) => VNodeChild'.
Type '{ name: any; fn: Function; }' is not assignable to type 'VNodeChild'.
`

I tried to create a vue app with the same components without webpack and it compiles without errors.
Steps to Reproduce the Problem
steps to reproduce:
- git clone https://github.com/michaelcozzolino/symfony-demo-vue-bug
- composer install
- yarn install
- yarn watch or yarn build
- observe the errors
- php -S localhost:8000 -t public/
The components are in assets/vue/components and the purpose of them is to show a list of names by using dynamic slot names.
by going to http://localhost:8000/en/blog/
the names are shown correctly.
Location of a Minimal Repository that Demonstrates the Issue.
https://github.com/michaelcozzolino/symfony-demo-vue-bug
I had the same problem and I tried to solve it by setting the transpileOnly option (see https://github.com/inertiajs/inertia/issues/1070#issuecomment-1084826500), but it didn't work.
The working solution for me was using the fork-ts-checker-webpack-plugin in webpack.mix.js, just like suggested here.
This is how my webpack.mix.js looks like now:
const mix = require('laravel-mix');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
mix.webpackConfig({
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: /node_modules/,
},
],
},
plugins: [new ForkTsCheckerWebpackPlugin()],
resolve: {
extensions: ['.*', '.js', '.jsx', '.vue', '.ts', '.tsx'],
},
})
.setPublicPath('./webroot')
.options({ processCssUrls: true });
mix.js('resources/js/foo.js', 'webroot/js/AssetMix')
.ts('resources/js/bar/src/main.ts', 'webroot/js/AssetMix/bar.js')
.vue({ version: 3 })
.version();
if (!mix.inProduction()) {
mix.sourceMaps();
}
Thanks a lot for your response @antogno. The fork-ts-checker-webpack-plugin also worked for me. I was a little concerned at first because your configuration example is a little daunting. However, the Webpack plugin was key to getting it working.
The implementation was actually more straightforward than I expected, at least for Webpack >5.92.x:
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
/* or */
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
/* then */
export default function() {
return {
...
plugins: [new ForkTsCheckerWebpackPlugin()],
module: {
rules: [
{
test: /\.ts$/,
loader: 'ts-loader'
}
]
}
...
}
}
The configuration example in their readme is good if you're not using ESM.