typescript - Hvordan kan jeg definere et array av objekter?


Jeg lager et array med objekter i TypeScript:

 userTestStatus xxxx = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
 };

Kan noen fortelle meg hvordan jeg kunne erklære typen dens riktig? Er det mulig å gjøre det inline, eller ville jeg trengt to definisjoner?

Jeg prøver å erstatte xxx med en typedeklarasjon, slik at TypeScript senere vil varsle meg hvis jeg ved en feil brukte noe som userTestStatus[3].nammme.

Svar #1

Du er bedre stilt ved å bruke et innfødt array i stedet for et objektliteral med tall-lignende egenskaper, slik at nummerering (så vel som mange andre array-funksjoner) håndteres direkte.

Det du leter etter her er en inline-grensesnittdefinisjon for arrayen din som definerer hvert element i den arrayen, enten det er til stede fra starten av eller introdusert senere:

let userTestStatus: { id: number, name: string }[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

Hvis du initialiserer arrayen din med verdier med en gang, er ikke den eksplisitte typedefinisjonen nødvendig; TypeScript kan automatisk utlede de fleste elementtypene fra den innledende tildelingen:

let userTestStatus = [
    { "id": 0, "name": "Available" },
    ...
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

Svar #2

Det du har over er et objekt, ikke et array.

For å lage et array, bruk [ og ] for å omslutte objektene dine.

userTestStatus = [
  { "id": 0, "name": "Available" },
  { "id": 1, "name": "Ready" },
  { "id": 2, "name": "Started" }
];

Bortsett fra det er TypeScript en superset av JavaScript, så det som er gyldig JavaScript vil være gyldig TypeScript, så ingen andre endringer er nødvendig.

Tilbakemeldingsavklaring fra OP... trenger en definisjon for modellen som ble lagt ut

Du kan bruke typene som er definert her for å representere objektmodellen din:

type MyType = {
    id: number;
    name: string;
}

type MyGroupType = {
    [key:string]: MyType;
}

var obj: MyGroupType = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
};
// or if you make it an array
var arr: MyType[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

Svar #3

Noen tslint-regler deaktiverer bruk av [], eksempel på melding: Array-type som bruker 'T[]' er forbudt for ikke-enkelte typer. Bruk 'Array<T>' i stedet.

Da ville du skrevet det slik:

var userTestStatus: Array<{ id: number, name: string }> = Array(
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
);

Svar #4

Array<T>
person: Array<{
  name: string;
  age: number;
}>

Svar #5

Litt gammelt, men jeg følte at jeg kunne bidra med litt klarhet til dette.

Eksakt svar

    interface MyObject {
      id: number;
      name: string;
    }

    interface MyExactData {
      [key: string]: MyObject;
    }

    let userTestStatus: MyExactData = {
      "0": { "id": 0, "name": "Available" },
      "1": { "id": 1, "name": "Ready" },
      "2": { "id": 2, "name": "Started" }
    };

Men det ovenfor er ikke hvordan vi vanligvis gjør et array av objekter, du ville bruke det enkle native arrayet i JavaScript.

    interface MyObject { // define the object (singular)
      id: number;
      name: string;
    }

    let userTestStatus_better: MyObject[] = [
      { "id": 0, "name": "Available" },
      { "id": 1, "name": "Ready" },
      { "id": 2, "name": "Started" }
    ];

Å legge til [] i grensesnittet vårt gir enkelttypen for et array av de nevnte objektene. Og å gjøre det inline

    let userTestStatus_inline: {id:number, name:string}[] = [
      { "id": 0, "name": "Available" },
      { "id": 1, "name": "Ready" },
      { "id": 2, "name": "Started" }
    ];

Jeg ville bruke grensesnittet siden du har noe som er definerbart, forståelig og gjenbrukbart. Hvis du trenger å gjøre endringer, kan du gjøre endringer på ett grensesnitt, og TypeScript vil rapportere eventuelle uoverensstemmelser mellom grensesnittet og koden.

Svar #6

Det du egentlig ønsker kan ganske enkelt være en opplisting

Hvis du leter etter noe som oppfører seg som en enumerasjon (fordi jeg ser at du definerer et objekt og knytter en sekvensiell ID 0, 1, 2 og inneholder et navn-felt som du ikke vil stave feil (f.eks. name vs naaame), er det bedre å definere en enumerasjon fordi den sekvensielle ID-en tas hånd om automatisk, og gir typeverifisering for deg rett ut av boksen.

enum TestStatus {
    Available,     // 0
    Ready,         // 1
    Started,       // 2
}

class Test {
    status: TestStatus
}

var test = new Test();
test.status = TestStatus.Available; // type and spelling is checked for you,
                                    // and the sequence ID is automatic

Verdiene ovenfor vil bli automatisk kartlagt, f.eks. "0" for "Available", og du kan få tilgang til dem ved å bruke TestStatus.Available. Og Typescript vil håndheve typen når du sender dem rundt.

Hvis du insisterer på å definere en ny type som et array av din egendefinerte type

Du ønsket en array av objekter, (ikke akkurat et objekt med nøklene "0", "1" og "2"), så la oss definere typen av objektet først, deretter typen av en inneholdende array.

class TestStatus {
    id: number
    name: string

    constructor(id, name){
        this.id = id;
        this.name = name;
    }
}

type Statuses = Array<TestStatus>;

var statuses: Statuses = [
    new TestStatus(0, "Available"),
    new TestStatus(1, "Ready"),
    new TestStatus(2, "Started")
]

Relaterte artikler