Czym jest błąd „nie można przypisać do parametru typu nigdy” w maszynopisie?


162

Kod to:

const foo = (foo: string) => {
  const result = []
  result.push(foo)
}

Otrzymuję następujący błąd TS:

[ts] Argumentu typu „string” nie można przypisać do parametru typu „never”.

Co ja robię źle? Czy to błąd?

Odpowiedzi:


253

Wszystko, co musisz zrobić, to zdefiniować swoją resultjako tablicę ciągów, jak poniżej:

const result : string[] = [];

Bez zdefiniowania typu tablicy domyślnie będzie to never. Więc kiedy próbowałeś dodać do niego ciąg, był to niezgodny typ, więc wyrzucił błąd, który zobaczyłeś.


7
Wydaje mi się to dziwne, dlaczego domyślnie never[]? czy jest kiedykolwiek pożytek z tego poza "tablicą, która ZAWSZE będzie pusta?"
Vincent Buscarello

7
Całkowicie się zgadzam, ponieważ szczerze mówiąc, nie przychodzi mi do głowy przypadek użycia, w którym tablica nevers będzie przydatna. Ale patrząc na to, natrafiłem na tę odpowiedź, która ma świetne informacje.
Tha'er M. Al-Ajlouni

9
Czy domyślnym typem nie powinno być „any”? Kiedy deklarujesz zmienną ( let x;), jest ona anydomyślnie typu. Nie never.
Shachar Har-Shuv

1
Zdecydowanie oczekiwałbym tablicy bez typu any[]. Byłem zaskoczony, że to never[]czyni go bezużytecznym. Nieintuicyjne. Dziękuję za odpowiedź. edycja: gramatyka
Igor Malyk

4
@VincentBuscarello Myślę, że głównym celem takiego ustawienia domyślnego jest stworzenie takiego, który zawsze dodaje typy do swoich tablic; ale komunikat o błędzie zdecydowanie nie jest pomocny.
YakovL

28

Innym sposobem jest:

const result = [] as  any;

8
W rzeczywistości używanie anynie jest dobrą opcją, ponieważ w zasadzie wyłącza wszelkie funkcje TypeScript. Jest to obejście i może prowadzić do różnych błędów.
Tomek Buszewski

1
Tak. Ale czasami nic innego nie działa, zwłaszcza gdy pracujesz z bibliotekami innych firm ..
neomib

14

Wydaje się, że jest to niedawna regresja lub jakieś dziwne zachowanie w maszynopisie. Jeśli masz kod:

const result = []

Zwykle byłoby to traktowane tak, jakbyś napisał:

const result:any[] = []

jednak jeśli masz zarówno noImplicitAnyFALSE, jak i strictNullChecks TRUE w swoim tsconfig, jest to traktowane jako:

const result:never[] = []

To zachowanie przeczy wszelkiej logice, IMHO. Włączenie sprawdzania wartości null zmienia typy wpisów tablicy? A potem włączenie noImplicitAnyfaktycznie przywraca użytkowanie anybez żadnych ostrzeżeń ??

Kiedy naprawdę masz tablicę any, nie powinieneś oznaczać jej dodatkowym kodem.


10

Miałem ten sam błąd w ReactJS funkcji statless podczas korzystania ReactJs Hook useState . Chciałem ustawić stan tablicy obiektów, więc jeśli użyję następującego sposobu

const [items , setItems] = useState([]);

i zaktualizuj stan w ten sposób:

 const item = { id : new Date().getTime() , text : 'New Text' };
 setItems([ item , ...items ]);

Otrzymałem błąd:

Argument typu „{id: numer; text: any} 'nie można przypisać do parametru typu' never '

ale jeśli zrobisz to w ten sposób,

const [items , setItems] = useState([{}]);

Błąd zniknął, ale istnieje element w indeksie 0, który nie ma żadnych danych (nie chcę tego).

więc rozwiązanie, które znalazłem, to:

const [items , setItems] = useState([] as any);

7

Otrzymałem ten sam błąd w komponencie funkcji ReactJS, używając haka useState ReactJS. Rozwiązaniem było zadeklarowanie typu useState przy inicjalizacji:

const [items , setItems] = useState<IItem[]>([]); // replace IItem[] with your own typing: string, boolean...

3

Udało mi się to obejść, używając słowa kluczowego Array zamiast pustych nawiasów:

const enhancers: Array<any> = [];

Posługiwać się:

if (typeof devToolsExtension === 'function') {
  enhancers.push(devToolsExtension())
}

2

Musisz wpisać resultdo tablicy ciągów const result: string[] = [];.



1

Usuń „strictNullChecks”: true z „compilerOptions” lub ustaw na false w pliku tsconfig.json aplikacji Ng. Te błędy znikną jak wszystko, a aplikacja zostanie pomyślnie skompilowana.

Zrzeczenie się : to tylko obejście. Ten błąd pojawia się tylko wtedy, gdy sprawdzenia wartości null nie są prawidłowo obsługiwane, co w każdym przypadku nie jest dobrym sposobem na załatwienie sprawy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.