943 Stimmen

get und set in TypeScript

Ich versuche, Get- und Set-Methode für eine Eigenschaft zu erstellen:

private _name: string;

Name() {
    get:
    {
        return this._name;
    }
    set:
    {
        this._name = ???;
    }
}

Wie lautet das Schlüsselwort, um einen Wert zu setzen?

15 Stimmen

Der Unterstrich und PascalCase sind im Konflikt mit den TypeScript-Codierungsrichtlinien: github.com/Microsoft/TypeScript/wiki/Coding-guidelines

4 Stimmen

Hallo @NielsSteenbeek - wenn Sie den TypeScript-Richtlinien für Mitwirkende folgen, würden Sie mit Properties und Backing-Feldern mit einem Namenskonflikt enden. Was ist der vorgeschlagene Ansatz?

1 Stimmen

Vielleicht: typescript privater name: string; getName() { get: {return this.name;} set: {this.name = ???;} }

0voto

gurkan Punkte 1266

Auch wenn TypeScript die Initialisierung der Eigenschaft analysiert, wenn Sie diesen Fall immer selbst behandeln möchten, können Sie dies in dieser Einstellung in ts.config.json auf false setzen.

{  
  "compilerOptions": {    
    "strict": true,
    "strictPropertyInitialization": false       
  }  
}

Strenge Eigenschaftsinitialisierung - strictPropertyInitialization Wenn auf true gesetzt, wird TypeScript einen Fehler melden, wenn eine Klasseneigenschaft deklariert wurde, aber nicht im Konstruktor gesetzt wurde.

In diesem Fall sollten Sie auch andere Fälle in Betracht ziehen, die Sie in den unten stehenden Links sehen.

class UserAccount {
  name: string;
  accountType = "user";

  email: string;//Die Eigenschaft 'email' hat keinen Initialisierer und wird nicht im Konstruktor definitiv zugewiesen.
  address: string | undefined;

  constructor(name: string) {
    this.name = name;
    // Beachten Sie, dass this.email nicht gesetzt ist
  }
}

this.name wird explizit gesetzt.
this.accountType wird standardmäßig gesetzt.
this.email ist nicht gesetzt und ruft einen Fehler auf.
this.address wird als potenziell undefined deklariert, was bedeutet, dass es nicht gesetzt werden muss.

Der Compiler gibt keinen Fehler aus, wenn wir strictPropertyInitialization auf false setzen.

  private _name : string;
  public get name() : string {
    return this._name;
  }
  public set name(v : string) {
    this._name = v;
  }

https://www.typescriptlang.org/docs/handbook/2/classes.html#--strictpropertyinitialization https://www.typescriptlang.org/tsconfig#strictPropertyInitialization

-6voto

cjbarth Punkte 3832

Wenn Sie mit TypeScript-Modulen arbeiten und versuchen, einen exportierten Getter hinzuzufügen, können Sie so etwas tun:

// dataStore.ts
export const myData: string = undefined;  // nur zur Unterstützung der Typisierung
let _myData: string;  // zum Zwischenspeichern der Getter-Ergebnisse

Object.defineProperty(this, "myData", {
    get: (): string => {
        if (_myData === undefined) {
            _myData = "meine Daten";  // tun Sie so, als ob dies lange dauern würde
        }

        return _myData;
    },
});

Dann haben Sie in einer anderen Datei:

import * as dataStore from "./dataStore"
console.log(dataStore.myData); // "meine Daten"

8 Stimmen

Das ist schrecklicher Rat. Insbesondere muss this auf der obersten Ebene eines Moduls undefiniert sein. Du könntest stattdessen exports verwenden, aber du solltest es überhaupt nicht tun, da es praktisch garantiert zu Kompatibilitätsproblemen führen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X