ich mit dem folgenden Typoskript bin zu kämpfen Problem kompilieren:Stringliteral und optionale Parameter nicht bekommen
const Names = {
francesco: 'francesco'
}
export interface A {
name: 'francesco';
age?: number;
}
const e: A = { name: Names.francesco, age: 26 };
Der Typoskript Compiler gibt die folgenden:
Type '{ name: string; age: number; }' cannot be converted to type 'A'.
Types of property 'name' are incompatible.
Type 'string' is not comparable to type '"francesco"'.
(property) francesco: string
Aber ich fanden zwei Möglichkeiten, den Compiler Stop beschwerte sich über die Stringliteral zu machen:
Methode 1
Den optionalen Parameter "age" der Schnittstelle A obligatorisch machen.
Methode 2
diese Zeile ersetzen
const e: A = { name: Names.francesco, age: 26 };
mit
const e: A = { name: 'francesco', age: 26 };
Hat warum geschieht dies eine Erklärung jemand haben?
Warum ist Ihr Schnittstelle Namen deklariert eine Zeichenfolge zu sein Literaler Typ? 'name: string' in der Schnittstelle scheint mir korrekt zu sein. – silentsod
@silentsod Das Beispiel ist eine Vereinfachung eines größeren Szenarios, in dem es sinnvoll ist, das Feld "name" als String-Literal anzugeben. Zum Beispiel möchte ich mehrere Schnittstellen dieser Art mit unterschiedlichen String-Literalen und verschiedenen optionalen Parametern haben: Schnittstelle B { Name: "jon"; Alter ?: Nummer; verpflichtend: any; } – francesco
Sie geben die Schnittstelle an, 'name' mit einem Typ' 'francesco' 'zu haben. Die Schnittstelle sollte Unterstützung für den allgemeinen Fall bieten (Namen sind Zeichenfolgen) und die Implementierungen der Schnittstelle werden spezifischer (z Implementierung, wo jeder Name ist "Francesco". Was Sie haben, ist im Wesentlichen rückwärts von, wie Schnittstellen tatsächlich verwendet werden. – silentsod