Dies ist ähnlich wie # 40796374, aber das sind Typen, während ich Schnittstellen verwende.
Angesichts des folgenden Codes:
interface Foo {
name: string;
}
function go() {
let instance: Foo | null = null;
let mutator = () => {
instance = {
name: 'string'
};
};
mutator();
if (instance == null) {
console.log('Instance is null or undefined');
} else {
console.log(instance.name);
}
}
Ich habe eine Fehlermeldung, dass der Name 'Eigenschaft' für den Typ 'Nie' nicht vorhanden ist.
Ich verstehe nicht, wie eine Instanz jemals ein "Niemals" sein könnte. Kann jemand etwas Licht ins Dunkel bringen?
Danke im Voraus.
typescript
Ray Booysen
quelle
quelle
else
tatsächlich niemals ausgewertet werden würde. Der Compiler ist klug genug, um es zu sehen.It's pretty clear from your code that the else would indeed never get evaluated.
Es ist überhaupt nicht offensichtlich und es gibt auch keinen intelligenten Compiler. Es gibt einen dummen Transpiler, der von den etablierten Praktiken abweicht. In C # kann mannull
zum Beispiel jedem Objekt zuweisen ...Antworten:
Da Sie die Zuordnung
instance
zunull
. Der Compiler schließt daraus, dass es niemals etwas anderes sein kann alsnull
. Es wird also davon ausgegangen, dass der else-Block niemals ausgeführt werden sollte und daherinstance
wienever
im else-Block eingegeben wird .Wenn Sie es nun nicht als Literalwert deklarieren
null
und auf andere Weise abrufen (z. B. :)let instance: Foo | null = getFoo();
, sehen Sie, dassinstance
es sichnull
im if-Block undFoo
im else-Block befindet.Geben Sie niemals Dokumentation ein: https://www.typescriptlang.org/docs/handbook/basic-types.html#never
Bearbeiten:
Das Problem im aktualisierten Beispiel ist tatsächlich ein offenes Problem mit dem Compiler. Sehen:
https://github.com/Microsoft/TypeScript/issues/11498 https://github.com/Microsoft/TypeScript/issues/12176
quelle
Wenn Sie Component als React.FC schreiben und useState () verwenden,
Schreiben Sie einfach so wäre hilfreich:
const [arr, setArr] = useState<any[]>([])
quelle
arr
as keinen Typ zuweisen kannarr: any
.Dies scheint diesem Problem ähnlich zu sein: Falsch "Eigenschaft existiert nicht für Typ 'nie'", wenn der Wert innerhalb des Rückrufs mit
strictNullChecks
geändert wird. Dies wird als Duplikat dieses Problems geschlossen (Diskussion): Kompromisse bei der Kontrollflussanalyse .Diese Diskussion ist ziemlich lang. Wenn Sie dort keine gute Lösung finden, können Sie Folgendes versuchen:
if (instance == null) { console.log('Instance is null or undefined'); } else { console.log(instance!.name); // ok now }
quelle
a!.b!.c
und habe das gesagtProperty c ...
.Ich hatte den gleichen Fehler und ersetzte die Punktnotation durch die Klammernotation, um sie zu unterdrücken.
zB: obj.name -> obj ['name']
quelle
Wenn Sie den Fehler im Parameter erhalten, behalten Sie die Eingabe
any
oder denany[]
Typ der Eingabe wie untengetOptionLabel={(option: any) => option!.name}
<Autocomplete options={tests} getOptionLabel={(option: any) => option!.name} .... />
quelle