Dlaczego typ klawisza jest string, a powinien być int?

0

mam sobie metode, w teori RowKeys powinien mieć inty

const onRowKeysChange = (RowKeys: Array<number>) => {
  setRowKeys(RowKeys);

    let selectedRow;
    for (let i = 0; i < data.length; i++) {
      if (data[i].key === RowKeys[0]) {
        selectedRow = data[i];
        break;
      }
    }

    if (selectedRow) {
      setName(selectedRow.name);
    }

};

I jak to jest że jak dam console.log(typeof(RowKeys[0])) to mi tu zwraca string, tu powinien być int a jest string, a console.log(typeof(data[0].key)) daje int i tu jest git

Czemu się tak dzieje?

Żeby to rozwiązać muszę robić tak

if (data[i].key === Number(RowKeys[0]))
0

no to wygląda tak, jakby statyczne typowanie w TypeScript się nie zgadzało z tym, co się rzeczywiście odpala w JavaScript.

i jak to jest że jak dam console.log(typeof(RowKeys[0])) to mi tu zwraca string,

A co masz faktycznie w całej tej tablicy? Skąd te dane lecą? Bo może dostajesz je dynamicznie w jakiejś postaci, natomiast to, co sobie zadeklarowałeś, nie do końca się zgadza ze stanem faktycznym?

tu powinien być int

Ale jaki int? Czemu miałby być int, skoro nie ma takiego typu nawet?

1

TypeScript nie robi checków w runtime, więc faktycznie tam może zostać przekazane cokolwiek.

1

Typescript tylko pilnuje żeby kod który wywołuje onRowKeysChange przekazywał tam inty, da się to "obejść" na miliony sposobów. Błąd jest nie w tym miejscu tylko w tym gdzie to wywołujesz

0

No ale zaraz jak przekazuje tablice typu number to czemu mam tam string zamiast numbera, używam Table która uzpuleniam danymi z bazy które są mapowane na dany typ i tam jak kliknę sobie na dany wierz to dostaje tablice z 1 elementem kluczem, gdzie w parametrze mam określony jaki ma być czyli tablica liczb

2
Kubuś Puchatek napisał(a):

No ale zaraz jak przekazuje tablice typu number to czemu mam tam string zamiast numbera,

Typy TypeScript działają (przynajmniej obecnie) tylko na etapie statycznej analizy, a uruchamia się stary dobry JavaScript bez typowania (kto wie, może kiedyś będzie inaczej), więc jeśli masz gdzieś dane, które wchodzą spoza TypeScripta (albo które w jakiś wadliwy sposób rzutujesz do danego typu), to jest możliwość, że pojawi ci się tablica stringów, która będzie otypowana w TypeScript jako co innego.

Żeby to sprawdzić, możesz zrobić console.log albo użyć debuggera i zobaczyć, co ci wypluwa (chyba, że problem jest gdzie indziej jeszcze, ale nie sprawdzisz, to się nie dowiesz).

0

Dzięki

1

W zasadzie to na tym polega statyczne typowanie, że typy są sprawdzane tylko na etapie kompilacji. Co więcej tam gdzie są (dodatkowo) sprawdzane w runtime (np. w javie) to a) często wynika to za słabošci języka/platformy ...b) i i tak sie da oszukać (tylko trzeba sie nieco wiecej niz w ts namęczyć).

0

zależy co masz na myśli typy. Bo np. w językach statycznie typowanych (takich prawdziwych), to reprezentacja binarna danych może już być znana mniej więcej na etapie kompilacji. Np. jeśli zdeklarujesz string, to on będzie trzymany tak w pamięci, a jak zdeklarujesz 32-bitową liczbę całkowitą, to tak będzie trzymana itp. a w JS nic nie wiadomo i silniki (V8 przynajmniej tak robi) mogą co najwyżej jakąś heurystykę robić i poczynić pewne założenia na podstawie tego, co się odpala. Bo silnik jednak lubi jak wie, jakie ma typy, wtedy może to sobie zoptymalizować pod spodem.

1
LukeJL napisał(a):

zależy co masz na myśli typy. Bo np. w językach statycznie typowanych (takich prawdziwych).

A które to są te prawdziwe i czy TS jest prawdziwie typowany czy nie? Po czym poznać?

0
LukeJL napisał(a):

zależy co masz na myśli typy. Bo np. w językach statycznie typowanych (takich prawdziwych)

Nie wiem czy takie rozróżnienie jest jakiś specjalnie pomocne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1