Un dev TYPESCRIPT dispo la pour un bug ?
LeChatSuke
il y a 3 mois
TomJedutort
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);
}
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);
}
Robin_Sparkles1
il y a 3 mois
a chaque fois encore des conneries d'impletation verbeuses.
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é
AttackerFois
il y a 3 mois
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
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);
}
}
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.
Pied2Sonic
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 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 !
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);
}
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
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
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
Calmacil
il y a 3 mois
Tu as bien typé tous les éléments des conditions ?
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
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
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
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 :
Alors que en dev ça fonctionne elle n'est pas null après les foreach elle vaut bien autre chose
AttackerFois
il y a 3 mois
Teste avec un ternary éventuellement
startPriceEL ? startPriceEL += fraisPostBooking ?? 0 : null
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;
Risimour
il y a 3 mois
jamaisdeban
il y a 3 mois
Tiens mon bon khey j'ai opti ton codeconst 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
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 typesCe 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 :
![]()
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
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
jamaisdeban
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.
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
LeLaboDeDexter2
il y a 3 mois
met la en :any et ca passe creme.
jerry
LeLaboDeDexter2
il y a 3 mois
jamaisdeban
il y a 3 mois
jamaisdeban
il y a 3 mois
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
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
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é
Et j'ai AUCUN any dans tout le code pour ceux qui se demandent
AttackerFois
il y a 3 mois
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
Risimour
il y a 3 mois