TypeScript-typförklaring genererar ett meddelande: Tecknet ">" är inte giltigt inuti ett JSX-element
I den här koden:
export const createCategoriesParams = (filters: string[]) => {
const tags = [...filters].filter(i => i !== 'All');
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
let row = <any>[];
tags.forEach(item => {
row.push(`tag=${item}`);
});
return row.join('&');
};
när jag kör mitt esbuild-skript, kastar det fel i:
tags.forEach((item, ind) => {
säga
Tecknet ">" är inte giltigt inuti ett JSX-element
någon idé om varför detta kan hända?
Svar #1
Samma fel uppstod i min kod efter uppdateringen av eslint-loader. I mitt fall ändrade eslint-loader beteende så att det automatiskt vet hur man hanterar varje fil (js, jsx, ts, tsx). Så jag behövde uppdatera min webpack-konfiguration
från
{
test: /\.tsx?$/,
loader: 'esbuild-loader',
options: {
target: 'esnext',
loader: 'tsx'
}
}
till
{
test: /\.tsx?$/,
loader: 'esbuild-loader',
options: {
target: 'esnext'
}
}
Svar #2
TypeScript-handboken varnar:
Kom ihåg hur man skriver en typförsäkran:
const foo = <foo>bar;Detta hävdar att variabeln
barhar typenfoo. Eftersom TypeScript också använder vinkelparenteser för typförsäkringar, skulle en kombination med JSX:s syntax medföra vissa parseringssvårigheter. Som ett resultat tillåter inte TypeScript vinkelparentestypförsäkringar i.tsx-filer.Eftersom ovanstående syntax inte kan användas i
.tsx-filer, bör en alternativ typförsäkringsoperator användas:as. Exemplet kan enkelt skrivas om medas-operatorn.const foo = bar as foo;
I ditt fall är raden som orsakar felet let row=<any>[]; som, bokstavligt talat, borde skrivas som let row=[] as any;. Även om let row: string[]=[]; skulle vara att föredra framför båda.
