Was ist der Fehler "Nicht dem Parameter vom Typ nie zuweisbar" im Typoskript?


162

Code ist:

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

Ich erhalte den folgenden TS-Fehler:

[ts] Das Argument vom Typ 'string' kann nicht dem Parameter vom Typ 'never' zugewiesen werden.

Was mache ich falsch? Ist das ein Fehler?

Antworten:


250

Alles, was Sie tun müssen, ist, Ihr resultArray wie folgt als String-Array zu definieren :

const result : string[] = [];

Ohne den Array-Typ zu definieren, wird dies standardmäßig sein never. Als Sie also versuchten, eine Zeichenfolge hinzuzufügen, war dies eine Typfehlanpassung, und der Fehler, den Sie gesehen haben, wurde ausgelöst.


6
Das kommt mir bizarr vor, warum standardmäßig never[]? Gibt es jemals eine Verwendung dafür außer "einem Array, das IMMER leer sein wird?"
Vincent Buscarello

6
Ich stimme vollkommen zu, weil ich mir ehrlich gesagt keinen Anwendungsfall vorstellen kann, bei dem eine Reihe von nevers nützlich sein wird. Aber als ich es mir ansah, stieß ich auf diese Antwort, die großartige Informationen enthält.
Tha'er M. Al-Ajlouni

8
Sollte der Standardtyp nicht "any" sein? Wenn Sie eine Variable ( let x;) deklarieren , ist sie anystandardmäßig vom Typ . Nicht never.
Shachar Har-Shuv

1
Würde definitiv ein Array ohne Typ erwarten any[]. War überrascht, never[]was es nutzlos macht. Unintuitiv. Danke für die Antwort. bearbeiten: Grammatik
Igor Malyk

4
@ VincentBuscarello Ich denke, der Hauptpunkt einer solchen Standardeinstellung ist, einen zu erstellen, der ihren Arrays immer Typen hinzufügt. aber die fehlermeldung ist definitiv nicht hilfreich.
YakovL

26

Ein anderer Weg ist:

const result = [] as  any;

8
Tatsächlich ist die Verwendung anykeine gute Option, da dadurch grundsätzlich alle TypeScript-Funktionen deaktiviert werden. Dies ist eine Problemumgehung und kann zu verschiedenen Fehlern führen.
Tomek Buszewski

1
Ja. Aber manchmal funktioniert nichts anderes, besonders wenn Sie mit Bibliotheken von Drittanbietern arbeiten.
Neomib

14

Dies scheint eine kürzliche Regression oder ein seltsames Verhalten im Typoskript zu sein. Wenn Sie den Code haben:

const result = []

Normalerweise wird es so behandelt, als ob Sie geschrieben hätten:

const result:any[] = []

Wenn Sie jedoch haben beide noImplicitAnyFALSCH AND strictNullChecks TRUE in Ihrem TSconfig, wird sie behandelt wie:

const result:never[] = []

Dieses Verhalten widerspricht meiner Meinung nach jeder Logik. Durch Aktivieren von Nullprüfungen werden die Eintragstypen eines Arrays geändert. Und dann schaltet das Einschalten noImplicitAnytatsächlich die Verwendung von anyohne Warnungen wieder her?

Wenn Sie wirklich ein Array von haben any, sollten Sie es nicht mit zusätzlichem Code angeben müssen.


10

Ich habe denselben Fehler in ReactJS statless Funktion bei der Verwendung von ReactJs Haken useState . Ich wollte den Status eines Objektarrays festlegen, wenn ich also die folgende Methode verwende

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

und aktualisieren Sie den Status wie folgt:

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

Ich habe eine Fehlermeldung erhalten:

Argument vom Typ '{id: number; text: any} 'kann nicht dem Parameter vom Typ' never 'zugewiesen werden.

aber wenn es so ist,

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

Fehler ist weg, aber es gibt einen Artikel bei Index 0, das keine Daten enthält (möchte das nicht).

Die Lösung, die ich gefunden habe, ist:

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

6

Ich habe den gleichen Fehler in der ReactJS-Funktionskomponente mit dem ReactJS useState-Hook erhalten. Die Lösung bestand darin, den Typ des useState bei der Initialisierung zu deklarieren:

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

3

Ich konnte dies überwinden, indem ich das Schlüsselwort Array anstelle von leeren Klammern verwendete:

const enhancers: Array<any> = [];

Verwenden:

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

2

Sie müssen in resultein Array von Zeichenfolgen eingeben const result: string[] = [];.



1

Entfernen Sie "strictNullChecks": true aus "compilerOptions" oder setzen Sie es in der Datei tsconfig.json Ihrer Ng-App auf false . Diese Fehler verschwinden wie alles andere und Ihre App wird erfolgreich kompiliert.

Haftungsausschluss : Dies ist nur eine Problemumgehung. Dieser Fehler tritt nur auf, wenn die Nullprüfungen nicht ordnungsgemäß behandelt werden, was in jedem Fall kein guter Weg ist, um Dinge zu erledigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.