Ich habe alle strengen Flaggen, die ich auf erwarten gedreht würde, also war ich verwirrt, als Typoskript den folgenden Code akzeptiert:Verhindern Typoskript aus der Gewährung des undefinierten Rückkehr
export class Test {
private records: {
[id: string]: number
};
constructor() {
this.records = {
"hello": 1,
"world": 3
}
}
public get(id: string): number {
return this.records[id];
}
}
Die get
Eigenschaft offensichtlich tut nicht immer eine Zahl zurückgeben: es wird undefined
zurückgeben, wenn die Funktion alles außer "hello"
und "world"
übergeben wird. Gibt es ein Flag, das diese Funktion abfangen würde und seinen Rückgabetyp number | undefined
erfordern würde, welcher der richtige Rückgabetyp ist?
Ich verwende bereits noImplicitAny
und strictNullChecks
. Sicherlich gibt es eine Möglichkeit, dies zu tun, da ich eine Funktion habe, die behauptet, eine number
zurückgeben undefined
zurückgeben!
Ihr Typ sagt, dass * jeder * String-Schlüssel für dieses Objekt eine Zahl zurückgibt. Wenn nur bestimmte bekannte Eigenschaften verfügbar sein sollen, verwenden Sie einen spezifischeren Typ. – jonrsharpe
@jonrsharpe - wenn das der Fall war, dann sollte es einen Typfehler im Konstruktor geben, und es gibt keinen. Ich bin mir bewusst, dass ich in dieser Instanz einen spezifischeren Schnittstellentyp verwenden könnte, aber das Beispiel, von dem ich das nahm, hatte eine Methode 'set (id: string, n: number): void'. –
Grundsätzlich tritt das Problem auf, weil Ihr Typ für 'records' falsch ist. Wie du sagst, wenn der Schlüssel fehlt, wirst du undefiniert, also sollte es '[id: string]: number | sein undefiniert. Dann erhalten Sie die entsprechenden Warnungen zu der Methode. Ich weiß nicht, warum du denkst, dass es im Konstruktor einen Typfehler geben sollte. Siehe auch dieses Problem: https://github.com/Microsoft/TypeScript/issues/9235 – jonrsharpe