Čo je chyba "not assignable to parameter of type never" v TypeScripte?


Kód je:

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

Dostávam nasledujúcu chybu TS:

[ts] Argument of type 'string' is not assignable to parameter of type 'never'.

Čo robím zle? Je to chyba?

Odpoveď č. 1

Všetko, čo musíte urobiť, je definovať svoj result ako pole reťazcov, ako nasledovne:

const result : string[] = [];

Bez definovania typu poľa bude predvolene never. Takže keď ste sa pokúsili pridať doň reťazec, došlo k nezrovnalosti typov a preto sa objavila chyba, ktorú ste videli.

Odpoveď č. 2

Ďalší spôsob je:

const result: any[] = [];

Odpoveď č. 3

Zdá sa, že ide o nejaké zvláštne správanie v TypeScripte, s ktorým sú uviaznutí z dôvodov dedičstva. Ak máte kód:

const result = []

Zvyčajne by sa to bralo tak, akoby ste napísali:

const result:any[] = []

avšak, ak máte noImplicitAny nastavené na FALSE A strictNullChecks nastavené na TRUE vo vašom tsconfig, považuje sa to za:

const result:never[] = []

Toto správanie je v rozpore s celou logikou, podľa môjho názoru. Zapnutie kontroly nulových hodnôt mení typy položiek v poli?? A potom zapnutie noImplicitAny vlastne obnoví používanie any bez akýchkoľvek varovaní??

Nie je intuitívne, že pridanie ďalšej kontroly typu (noImplicitAny) vedie k uvoľnenejšiemu kontrolovaniu typov, najmä keď to zavádza práve to, čo ste sa snažili eliminovať.

Odpoveď č. 4

Dostal som tú istú chybu v React funkčnej komponente pri používaní hooku useState.

Riešením bolo deklarovať typ useState pri inicializácii pomocou uhlových zátvoriek:

// Example: type of useState is an array of string
const [items , setItems] = useState<string[]>([]); 

Odpoveď č. 5

Mal som rovnakú chybu v stateless funkcii ReactJS pri používaní ReactJs Hook useState. Chcel som nastaviť stav poľa objektov, takže ak použijem nasledujúci spôsob

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

a aktualizovať stav takto:

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

Dostával som chybu:

Argument typu '{ id: number; text: any }' nie je priraditeľný k parametru typu 'never'

ale ak to urobím takto,

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

Chyba je preč, ale na 0 indexe je položka, ktorá nemá žiadne údaje (nechcem to).

takže riešenie, ktoré som našiel, je:

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

Odpoveď č. 6

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

Museli ste špecifikovať, čo pole je, pretože result=[] má návratový typ any[]. Zvyčajne sa chcete vyhnúť typom any, pretože sú určené na použitie ako „úniková cesta“ podľa Microsoftu.

Výsledkom je objekt, ktorý je poľom string.

Odpoveď č. 7

Riešenie, ktoré som našiel, bolo

const [files, setFiles] = useState([] as any);

Odpoveď č. 8

Podarilo sa mi to obísť použitím kľúčového slova Array namiesto prázdnych zátvoriek:

const enhancers: Array<any> = [];

Použiť :

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

Odpoveď č. 9

Chyba: Argument typu 'any' nie je priraditeľný k parametru typu 'never'.

V tsconfig.json -

  "noImplicitReturns": false,

   "strictNullChecks":false,

Riešenie: zadajte ako 'never'

Súvisiace články