javascript - Verschachtelte Objekte in TypeScript
Wie deklariert man in TypeScript JavaScript-ähnliche verschachtelte Objekte?
let endpoints = {
auth: {
login: "http://localhost:8079/auth/login"
}
};
Das Folgende funktioniert nicht:
private endpoints: Object = {
auth: {
login: "http://localhost:8079/auth/login"
}
};
Wirft :
error TS2339: Property 'auth' does not exist on type 'Object'.Antwort #1
Sie können Schnittstellen verwenden:
interface EndpointAuth {
login: string;
}
interface Endpoint {
auth: EndpointAuth;
}
let endpoints: Endpoint = {
auth: {
login: "http://localhost:8079/auth/login"
}
};
(Code im Playground)
Sie können auch Typen anstelle von Schnittstellen verwenden:
type EndpointAuth = {
login: string;
}
type Endpoint = {
auth: EndpointAuth;
}
(Code im Playground)
Oder „inline“:
let endpoints: { auth: { login: string } } = {
auth: {
login: "http://localhost:8079/auth/login"
}
};
Du kannst sie natürlich kombinieren.
Bearbeiten
Da Sie die Antwort so wollten, dass erklärt wird, warum es mit Object nicht funktionierte:
Eine Variable vom Typ Object zu definieren ist (in den meisten Fällen) nicht das, was man wirklich tun möchte; normalerweise meint man any, wie dies:
var endpoints2: any = {
auth: {
login: "http://localhost:8079/auth/login"
}
};
Wird nicht fehlschlagen (genau wie es nicht fehlschlägt, wenn Sie keinen Typ angeben).
Eine Variable als Object zu definieren ist dasselbe, wie sie als {} zu definieren, was ein leeres Objekt ist, und das ist normalerweise nicht das, was Sie erreichen möchten, und es funktioniert nur für Dinge wie:
let o1: Object = {};
let o2: Object = Object.create(null);
Aber die Verwendung von any hilft dir nicht viel, weil du damit im Grunde dem Compiler sagst, sich nicht um die Typensicherheit zu kümmern. Er lässt dich alles mit der Variable machen, ohne dir mitzuteilen, dass es Fehler gibt:
let o: any = { x: 3, y: 6 };
console.log(o.z.toString());
Wird beim Kompilieren nicht fehlschlagen, aber zur Laufzeit fehlschlagen:
Ungefangener TypeError: Kann Eigenschaft 'toString' von undefiniert nicht lesen
Dies wird bei der Kompilierung fehlschlagen:
let o: { x: number, y: number } = { x: 3, y: 6 };
console.log(o.z.toString());
Antwort #2
Sie können ein Interface deklarieren.
Für Ihren Fall
interface IEndpoints
{
auth: {
login: string;
}
}
private endpoints: IEndpoints = {
auth: {
login: "http://localhost:8079/auth/login"
}
};
