Č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'

