Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Webpack cant compile ts 3.7 (Optional Chaining, Nullish Coalescing)

I try to use typescript 3.7 features like Optional Chaining, Nullish Coalescing. But webpack gives me an error while transpaling.

app: Module parse failed: Unexpected token (50:40) app: File was processed with these loaders: app:  * ../../../node_modules/ts-loader/index.js app: You may need an additional loader to handle the result of these loaders. app: | export const Layout = (props) => { app: |     const regionsResults = useQuery(regionsQuery, { fetchPolicy: 'cache-first' }); app: >     const regions = regionsResults.data?.regions ?? []; app: |     const userItem = useQuery(usersProfileQuery, { fetchPolicy: 'cache-first' }); app: |     const handleOnClick = (selected) => props.history.push(selected.key); ``  
like image 849
Edgaras Karka Avatar asked Nov 12 '19 06:11

Edgaras Karka


People also ask

Can we combine optional chaining and Nullish coalescing?

Optional chaining is often used together with nullish coalescing, which is the ability to fall back to a default value when the primary expression evaluates to null or undefined .

Could you explain about optional chaining and Nullish coalescing operator?

Relationship with the optional chaining operator ( ?. ) The nullish coalescing operator treats undefined and null as specific values and so does the optional chaining operator ( ?. ) which is useful to access a property of an object which may be null or undefined .


2 Answers

I changed target: esnext to es2018 in tsconfig.json file. Now it works.

Webpack issue for reference : https://github.com/webpack/webpack/issues/10227

like image 199
Edgaras Karka Avatar answered Oct 14 '22 06:10

Edgaras Karka


Depending on which loader you're using to transiple the code, there are several options available

For ts-loader, you need to make sure the output from typescript is understandable by Webpack. This can be achieved by setting target to ES2018 in tsconfig.json.

For babel-loader, you'll need to make sure babel loads the

  • @babel/plugin-proposal-nullish-coalescing-operator
  • @babel/plugin-proposal-optional-chaining

plugins. Note that if you're using preset-env, it may or may not load these plugins depending on your targets or browserlist (ie, won't be loaded if the target env has support for these language features), in which case the only way to guarantee their inclusion is by manually specifying them in the plugins array in babel.config.js,

  plugins: [     '@babel/plugin-proposal-nullish-coalescing-operator',     '@babel/plugin-proposal-optional-chaining',   ], 
like image 30
aryzing Avatar answered Oct 14 '22 07:10

aryzing