Un dev TYPESCRIPT dispo la pour un bug ?

OP
RI

Risimour

il y a 3 mois

Un soucis de typage qui me rend ZINZIN https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif

C'est un tout petit bout de code, une variable qui est de type never alors que elle devrait pas https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif

Si quelqu'un est chaud de me donner son avis go MP svp https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif

LC

LeChatSuke

il y a 3 mois

Publie le code et l'erreur ici
OP
RI

Risimour

il y a 3 mois

https://image.noelshack.com/fichiers/2025/04/2/1737471794-bug1.png
https://image.noelshack.com/fichiers/2025/04/2/1737471801-bug2.png
OP
RI

Risimour

il y a 3 mois

A la base à la place de if(startPriceEL !== null) j'avais juste mis if(startPriceEL)
Mais j'ai rajouté le !== null pour forcer typescript à comprendre que ça peut pas être null à cet endroit la si ça rentre dans le IF et rien à faire https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif
OP
RI

Risimour

il y a 3 mois

C'est comme si il partait du principe que malgré les foreach y a absolument AUCUNE chance que la variable startPriceEL puisse passer de null à number alors que c'est le putain de cas https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif
TJ

TomJedutort

il y a 3 mois

flemme dsl
KH

kheyduHelm3

il y a 3 mois

Je vois le problème. L'erreur vient du fait que TypeScript infère le type never pour startPriceEL à cause de la façon dont la variable est initialisée et utilisée. Voici comment corriger ça :
Les changements clés sont :
Déclarer explicitement startPriceEL comme number | null
Éviter l'union de type avec never en initialisant correctement la variable
Le problème venait probablement de la déclaration initiale let startPriceEL: null | number = null; qui créait une confusion dans l'inférence de type lors des opérations suivantes.
Cette solution devrait résoudre votre problème de typage. La variable pourra maintenant correctement recevoir des valeurs numériques et être utilisée dans les calculs.

// ... existing code ...
let startPriceEL: number | null = null;
let startPriceELFormatted: string | null = null;

if(displaySpecialSeat) {
arrayRangeeEL.forEach(rangee => {
if(
(rangee.prix && rangee.prix > 0) &&
rangee.prixMarge &&
(!startPriceEL || (startPriceEL > rangee.prixMarge))
){
startPriceEL = rangee.prixMarge;
}
// ... existing code ...
});
}

if(startPriceEL !== null){
if(fraisPostBooking){
startPriceEL += fraisPostBooking ?? 0;
}
startPriceELFormatted = formatPrice(startPriceEL / 100);
}

OP
RI

Risimour

il y a 3 mois

TomJedutort

il y a 3 mois


flemme dsl

Merci du up en dépit de ent https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif

OP
RI

Risimour

il y a 3 mois

kheyduHelm3

il y a 3 mois


Je vois le problème. L'erreur vient du fait que TypeScript infère le type never pour startPriceEL à cause de la façon dont la variable est initialisée et utilisée. Voici comment corriger ça :
Les changements clés sont :
Déclarer explicitement startPriceEL comme number | null
Éviter l'union de type avec never en initialisant correctement la variable
Le problème venait probablement de la déclaration initiale let startPriceEL: null | number = null; qui créait une confusion dans l'inférence de type lors des opérations suivantes.
Cette solution devrait résoudre votre problème de typage. La variable pourra maintenant correctement recevoir des valeurs numériques et être utilisée dans les calculs.

// ... existing code ...
let startPriceEL: number | null = null;
let startPriceELFormatted: string | null = null;

if(displaySpecialSeat) {
arrayRangeeEL.forEach(rangee => {
if(
(rangee.prix && rangee.prix > 0) &&
rangee.prixMarge &&
(!startPriceEL || (startPriceEL > rangee.prixMarge))
){
startPriceEL = rangee.prixMarge;
}
// ... existing code ...
});
}

if(startPriceEL !== null){
if(fraisPostBooking){
startPriceEL += fraisPostBooking ?? 0;
}
startPriceELFormatted = formatPrice(startPriceEL / 100);
}

Non j'ai déjà essayé chatGPT même Claude AI c'est de la merde y a rien qui fonctionne dans ce qu'ils proposent ahi https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif

RS

Robin_Sparkles1

il y a 3 mois

non mais typescript au secours , je comprends rien à ces typages de zinzin
a chaque fois encore des conneries d'impletation verbeuses.
P2

Pied2Sonic

il y a 3 mois

ben tu fais += donc tu incrémente khey
commence par le foutre a 0 au lieu de never ?

et a la fin du traitement, si 0 tu remplace par never, et le tour est joué

KH

kheyduHelm3

il y a 3 mois

Non j'ai déjà essayé chatGPT même Claude AI c'est de la merde y a rien qui fonctionne dans ce qu'ils proposent ahi https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif

AHI t'es baisé alors mon caillou https://image.noelshack.com/fichiers/2017/30/4/1501186458-risitalarmebestreup.gif
c'était sonnet là

AF

AttackerFois

il y a 3 mois

T'as déclaré ta variable en null, qu'est-ce que tu comprends pas
P2

Pied2Sonic

il y a 3 mois


ben tu fais += donc tu incrémente khey
commence par le foutre a 0 au lieu de never ?

et a la fin du traitement, si 0 tu remplace par never, et le tour est joué

en gros tu fais never += 0 ou never += NOMBRE
fais ton_bail = 0
après ton_bail = += 0 ou never += NOMBRE
fin de foreach

if tonbail = 0 , alors tonbail = never

KH

kheyduHelm3

il y a 3 mois

// ... existing code ...
let startPriceEL: number = 0; // On initialise à 0 au lieu de never
let startPriceELFormatted: string | null = null;

if(displaySpecialSeat) {
arrayRangeeEL.forEach(rangee => {
if(
(rangee.prix && rangee.prix > 0) &&
rangee.prixMarge &&
(startPriceEL === 0 || (startPriceEL > rangee.prixMarge))
){
startPriceEL = rangee.prixMarge;
}
// ... reste du code ...
});

// À la fin du traitement
if(startPriceEL === 0) {
startPriceEL = null as never;
}

if(startPriceEL !== null) {
if(fraisPostBooking){
startPriceEL += fraisPostBooking ?? 0;
}
startPriceELFormatted = formatPrice(startPriceEL / 100);
}
}

CA

Calmacil

il y a 3 mois

Y'a probablement un truc dans tes conditions qui font que c'est impossible que soit set. Si tu penses que c'est le cas (en gros que l'analyse se trompe), désactive le warning soit avec ta tsconfig soit avec eslint ou je sais plus quoi, et run le truc en debug pour voir si ça reach.

Ce qui est chelou c'est qu'il devrait te montrer quelle condition précisément foire, à moins qu'il lui manque les types pour le déduire.

P2

Pied2Sonic

il y a 3 mois

t'es là mon caillou ?
PP

Psycho-Pirate

il y a 3 mois

Je pense que tu as oublié un ";" quelque part
https://image.noelshack.com/fichiers/2022/41/3/1665602536-1637064840-image-9post-ou-kyst-anal.png
OP
RI

Risimour

il y a 3 mois

Alors oui si j'initialise la variable à 0 ça fonctionne ça je sais mais mon code devrait fonctionner de toute façon.

Si ça démarre à null puis y a les foreach qui écrase la variable en lui assignant des number et qu'a la fin je vérifie que la variable n'est pas null alors elle est FORCEMENT de type number donc il devrait comprendre !

JA

jamaisdeban

il y a 3 mois

j'ai foutu ca dans mon IDE avec des variables yolo vu que j'ai pas ton code et mon TS accepte

let startPriceEL: null | number = null;
let startPriceELFormatted: string | null = null;
const fraisPostBooking = 0;
const displaySpecialSeat = true;
const arrayRangeEL = [];
if (displaySpecialSeat) {
arrayRangeEL.forEach((rangee) => {
if (
rangee.prix &&
rangee.prix > 0 &&
rangee.prixMarge &&
(!startPriceEL || startPriceEL > rangee.prixMarge)
) {
startPriceEL = rangee.prixMarge;
}

rangee.sieges.forEach((siege) => {
if (
siege.dispo &&
siege.prixMarge &&
(!startPriceEL || startPriceEL > siege.prixMarge)
) {
startPriceEL = siege.prixMarge;
}
});
});
}

if (startPriceEL !== null) {
if (fraisPostBooking) {
startPriceEL += fraisPostBooking ?? 0;
}
startPriceELFormatted = formatPrice(startPriceEL / 100);
}

P2

Pied2Sonic

il y a 3 mois


Alors oui si j'initialise la variable à 0 ça fonctionne ça je sais mais mon code devrait fonctionner de toute façon.

Si ça démarre à null puis y a les foreach qui écrase la variable en lui assignant des number et qu'a la fin je vérifie que la variable n'est pas null alors elle est FORCEMENT de type number donc il devrait comprendre !

on s'en fout; typescript c'est un language de mise en forme, t'es sensé faire tes calculs en php ou en language derrière, donc en typescript tu fais au mieux

initialise a 0 et assigne ensuite, crois moi, te casse pas la tête

LC

LeChatSuke

il y a 3 mois

Risimour

il y a 3 mois


Alors oui si j'initialise la variable à 0 ça fonctionne ça je sais mais mon code devrait fonctionner de toute façon.

Si ça démarre à null puis y a les foreach qu iécrase la variable en lui assignant des number et qu'a la fin je vérifie que la variable n'est pas null alors elle est FORCEMENT de type number donc il devrait comprendre !

je t'ai demandé de publier le code mais j'y connais rien en type script
essaye d'imprimer le résultat quitte à y aller ligne par ligne, tu verras bien ce qu'il se passe
ou sur vs code il y a probablement des extensions pour voir l'état d'une variable en type script au cours de l'exécution

AF

AttackerFois

il y a 3 mois


Alors oui si j'initialise la variable à 0 ça fonctionne ça je sais mais mon code devrait fonctionner de toute façon.

Si ça démarre à null puis y a les foreach qui écrase la variable en lui assignant des number et qu'a la fin je vérifie que la variable n'est pas null alors elle est FORCEMENT de type number donc il devrait comprendre !

0 est un integer, éventuellement un boolean false

null est un type

Donc non, ce n'est pas du tout la même chose d'initialiser une constante ou une variable en null ou 0

CA

Calmacil

il y a 3 mois

C'est chelou en effet
Tu as bien typé tous les éléments des conditions ?
TM

TheMadLad7

il y a 3 mois

faut que tu cast ta variable dans le type que tu veux juste avant

startPriceEL = startPriceEL as number

ou bien même

fraisPostBooking += startPriceEL as number

si ça marche pas c'est que t'as merdé plus haut ou que Typescript perds les pédales dans ce cas redémarre ton vscode

+ ta double loop c'est dégueulasse khey

KH

kheyduHelm3

il y a 3 mois


Alors oui si j'initialise la variable à 0 ça fonctionne ça je sais mais mon code devrait fonctionner de toute façon.

Si ça démarre à null puis y a les foreach qui écrase la variable en lui assignant des number et qu'a la fin je vérifie que la variable n'est pas null alors elle est FORCEMENT de type number donc il devrait comprendre !

Ah, je comprends mieux votre frustration ! En effet, logiquement votre code devrait fonctionner puisque TypeScript devrait être capable de comprendre que après les assignations et la vérification !== null, la variable est forcément de type number.
Essayons cette approche plus explicite avec un type guard :
let startPriceEL: number | null = null;
let startPriceELFormatted: string | null = null;

if(displaySpecialSeat) {
arrayRangeeEL.forEach(rangee => {
if(
(rangee.prix && rangee.prix > 0) &&
rangee.prixMarge &&
(!startPriceEL || (startPriceEL > rangee.prixMarge))
){
startPriceEL = rangee.prixMarge; // Ici c'est forcément un number
}
});

if(startPriceEL !== null) {
// On peut ajouter une assertion de type ici si nécessaire
const price = startPriceEL as number;
if(fraisPostBooking){
price += fraisPostBooking ?? 0;
}
startPriceELFormatted = formatPrice(price / 100);
}
}

Ou alors, on peut être encore plus explicite avec TypeScript en utilisant un type guard personnalisé :

function isNumber(value: any): value is number {
return typeof value === 'number';
}

// ... dans votre code ...
if(startPriceEL !== null && isNumber(startPriceEL)) {
startPriceEL += fraisPostBooking ?? 0;
}

C'est vrai que c'est un peu frustrant que TypeScript ne comprenne pas automatiquement ce narrowing de type qui nous semble logique. C'est une des limitations du système de types de TypeScript dans certains cas complexes.

----

Et là ça marche ou j'arrête de prompt sonnet ?
Je fais pas de typescript perso

OP
RI

Risimour

il y a 3 mois

Je sais pas si je me fais bien comprendre :

1 - J'initialise une variable a NULL

2 - Des traitements s'éxécutent et peuvent remplacer la valeur NULL de la variable par des number.

3 - Je test si la variable est toujours null et si c'est pas le cas c'est qu'elle est FORCEMENT un number et donc j'incrémente

Ca me parait logique.

En dehors de ça tout mon build passe, aucune erreur détecté par la CI et la qualité

Alors oui je peux initialiser à 0 on est d'accord mais ça me gonfle de pas comprendre pourquoi ça ne marche pas comme ça

ZG

Zosime_Gamal

il y a 3 mois

Redémarre le Windows https://image.noelshack.com/fichiers/2022/21/4/1653554488-ahi-wonki-tison.png
OP
RI

Risimour

il y a 3 mois

Et non j'ai vérifié TOUS les autres typage de toutes les autres variable au fur et a mesure du code y a aucun soucis
Et désolé je peux pas mettre tout le code c'est méga long y a des dizaines de composants react et des centaines de types

Ce qui me fait buguer c'est que TS part du principe que peut importe ce qui se passe dans les foreach la variable ne changera jamais de valeur ca restera null quoi qu'il arrive : https://image.noelshack.com/fichiers/2025/04/2/1737472783-bug3.png

Alors que en dev ça fonctionne elle n'est pas null après les foreach elle vaut bien autre chose

T3

Trizoww3

il y a 3 mois


Redémarre le Windows https://image.noelshack.com/fichiers/2022/21/4/1653554488-ahi-wonki-tison.png

Votre box est branché ?

AF

AttackerFois

il y a 3 mois

Teste avec un ternary éventuellement

startPriceEL ? startPriceEL += fraisPostBooking ?? 0 : null

JA

jamaisdeban

il y a 3 mois

Tiens mon bon khey j'ai opti ton code

const startPriceEL = arrayRangeEL.reduce<number | undefined>((lowestPrice, rangee) => { if (rangee.prix && rangee.prix > 0 && rangee.prixMarge) { lowestPrice = lowestPrice === undefined ? rangee.prixMarge : Math.min(lowestPrice, rangee.prixMarge); } rangee.sieges.forEach(siege => { if (siege.dispo && siege.prixMarge) { lowestPrice = lowestPrice === undefined ? siege.prixMarge : Math.min(lowestPrice, siege.prixMarge); } }); return lowestPrice; }, undefined); const finalPriceEL = startPriceEL !== undefined ? startPriceEL + (fraisPostBooking ?? 0) : undefined; const startPriceELFormatted = finalPriceEL !== undefined ? formatPrice(finalPriceEL / 100) : undefined;
RS

Robin_Sparkles1

il y a 3 mois


Redémarre le Windows https://image.noelshack.com/fichiers/2022/21/4/1653554488-ahi-wonki-tison.png

Redemarre la box https://image.noelshack.com/fichiers/2018/10/1/1520260980-risitas94.png

Je suis jaloux de l'op quand je fais des topic pour m'aider j'ai zéro r&ponse mais la armada de dev qui accourent ahii

OP
RI

Risimour

il y a 3 mois

jamaisdeban

il y a 3 mois


Tiens mon bon khey j'ai opti ton code

const startPriceEL = arrayRangeEL.reduce<number | undefined>((lowestPrice, rangee) => { if (rangee.prix && rangee.prix > 0 && rangee.prixMarge) { lowestPrice = lowestPrice === undefined ? rangee.prixMarge : Math.min(lowestPrice, rangee.prixMarge); } rangee.sieges.forEach(siege => { if (siege.dispo && siege.prixMarge) { lowestPrice = lowestPrice === undefined ? siege.prixMarge : Math.min(lowestPrice, siege.prixMarge); } }); return lowestPrice; }, undefined); const finalPriceEL = startPriceEL !== undefined ? startPriceEL + (fraisPostBooking ?? 0) : undefined; const startPriceELFormatted = finalPriceEL !== undefined ? formatPrice(finalPriceEL / 100) : undefined;

Bon je vais initialiser à 0 mais je creuserai je veux comprendre pourquoi typescript raisonne comme ça, ça a pas de sens

Merci khey je regarde ça

TM

TheMadLad7

il y a 3 mois


Et non j'ai vérifié TOUS les autres typage de toutes les autres variable au fur et a mesure du code y a aucun soucis
Et désolé je peux pas mettre tout le code c'est méga long y a des dizaines de composants react et des centaines de types

Ce qui me fait buguer c'est que TS part du principe que peut importe ce qui se passe dans les foreach la variable ne changera jamais de valeur ca restera null quoi qu'il arrive : https://image.noelshack.com/fichiers/2025/04/2/1737472783-bug3.png

Alors que en dev ça fonctionne elle n'est pas null après les foreach elle vaut bien autre chose

Mais c'est normal les dons de divination de ton IDE ne sont pas sans fin

Faut bien comprendre que Typescript c'est une abstraction

T'as attribué un union type a ta variable elle restera du type de cet union type sauf si tu la cast, ou bien si ton IDE détecte que ton code génère un type en particulier, si c'est trop complexe ( genre ta double loop ) il s'en fou de ce qui sort derrière

C'est quoi ton salaire pour savoir ?

][

]redstar[

il y a 3 mois

met la en :any et ca passe creme.
OP
RI

Risimour

il y a 3 mois

TheMadLad7

il y a 3 mois

Mais c'est normal les dons de divination de ton IDE ne sont pas sans fin

Faut bien comprendre que Typescript c'est une abstraction

T'as attribué un union type a ta variable elle restera du type de cet union type sauf si tu la cast, ou bien si ton IDE détecte que ton code génère un type en particulier, si c'est trop complexe ( genre ta double loop ) il s'en fou de ce qui sort derrière

C'est quoi ton salaire pour savoir ?

Mec si je dis a typescript que cette variable est soit null soit un number et que quand je test plus tard dans un if si la variable n'est pas null c'est que a priori elle ne peut être que number non ?

Je comprend ce que tu me dis après mais bon ça m'intéresse de comprendre comment process typescript dans ces cas la et mon salaire je le garde pour moi car je sens un certain mépris dans cette question https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png

JA

jamaisdeban

il y a 3 mois

moi j'aimerais savoir pour quel boite tu boss pour faire un code sur le prix des places d'avions airfrance ?
OP
RI

Risimour

il y a 3 mois

jamaisdeban

il y a 3 mois


moi j'aimerais savoir pour quel boite tu boss pour faire un code sur le prix des places d'avions airfrance ?

C'est une interface pour les plan de vol pour choisir sa place dans l'avion ahi but please dont revelate https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png
Et non c'est pas une compagnie aérienne

AF

AttackerFois

il y a 3 mois

Tu utilises TypeScript, mais tu ne tires pas l'avantage du typage.
Tu utilises une union alors que tu n'en as pas besoin.
Tu fais un conditionnel dégueulasse ou tu ne vérifies rien alors que tu pourrais en plus utiliser des ternary plus propres style :

value ? doThis() : doThat()

Refais ça proprement stp, un integer s'initialise avec un integer, idéalement 0, pas un null. Tu veux un null si tu fais une lazy instantiation, complètement inutile dans ton cas.

TM

TheMadLad7

il y a 3 mois

Mec si je dis a typescript que cette variable est soit null soit un number et que quand je test plus tard dans un if si la variable n'est pas null c'est que a priori elle ne peut être que number non ?

non pas du tout l'algorithme que tu poses n'est pas censé réfléchir lui même, ce que t'attends de lui c'est ce qui est autogénéré par ton IDE

C'est pas du mépris je t'assures c'est juste pour comprendre mon environnement, si tu veux pas alors donne moi juste ton niveau de diplôme + expérience stp

LL

LeLaboDeDexter2

il y a 3 mois


met la en :any et ca passe creme.

jerry

LL

LeLaboDeDexter2

il y a 3 mois

number | unkown
JA

jamaisdeban

il y a 3 mois

et le franglais dans le code pitié arrete, fraisPostBooking bon comment dire
RY

ryeongdoja

il y a 3 mois

La magie du typage dans TYP enfin javascript https://image.noelshack.com/fichiers/2016/26/1467335935-jesus1.png up
JA

jamaisdeban

il y a 3 mois

l'op qui a 5 CTO, 8 tech lead et 6 senior backend sur son topic
OP
RI

Risimour

il y a 3 mois

AttackerFois

il y a 3 mois


Tu utilises TypeScript, mais tu ne tires pas l'avantage du typage.
Tu utilises une union alors que tu n'en as pas besoin.
Tu fais un conditionnel dégueulasse ou tu ne vérifies rien alors que tu pourrais en plus utiliser des ternary plus propres style :

value ? doThis() : doThat()

Refais ça proprement stp, un integer s'initialise avec un integer, idéalement 0, pas un null. Tu veux un null si tu fais une lazy instantiation, complètement inutile dans ton cas.

Ca va être optimisé et cleané dans un second temps oui la je me penchais juste sur ce cas d'erreur de typage c'est tout https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png

En fait j'ai tendance a initialiser à null parce que je me dis que ca apporte une info si c'est null c'est que y avait aucun siege de ce type la, si c'est 0 c'est que dans les données il est tombé sur un siège dont le prix est à 0 c'est déjà une info https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png

Mais oui c'est probablement pas la bonne façon de raisonner c'est bon j'ai initialisé à 0 et viré l'union tout fonctionne aucune erreur de typage mon build est passé https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png

Et j'ai AUCUN any dans tout le code pour ceux qui se demandent https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png

OP
RI

Risimour

il y a 3 mois

jamaisdeban

il y a 3 mois


l'op qui a 5 CTO, 8 tech lead et 6 senior backend sur son topic

Oui je sens que c'est qu'une question de secondes avant de me manger des pavés d'insulte https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png

AF

AttackerFois

il y a 3 mois

En fait j'ai tendance a initialiser à null parce que je me dis que ca apporte une info si c'est null c'est que y avait aucun siege de ce type la, si c'est 0 c'est que dans les données il est tombé sur un siège dont le prix est à 0 c'est déjà une info https://image.noelshack.com/fichiers/2020/52/6/1608985783-ahi-triangle.png

Tu peux assigner un value avec un signed négatif dans ce genre de cas, si t'as besoin d'utiliser tous les prix positifs 0 inclus.

Dans ce cas-là tu initialises à -1

TM

TheMadLad7

il y a 3 mois

tu sais que tu peux assigner null a une variable dont le type est number ? https://image.noelshack.com/fichiers/2018/26/7/1530476579-reupjesus.png