typescript - Hur kan jag definiera en array av objekt?
Jag skapar en array av objekt i TypeScript:
userTestStatus xxxx = {
"0": { "id": 0, "name": "Available" },
"1": { "id": 1, "name": "Ready" },
"2": { "id": 2, "name": "Started" }
};
Kan någon berätta för mig hur jag kan deklarera dess typ korrekt? Är det möjligt att göra det inline eller skulle jag behöva två definitioner?
Jag vill ersätta xxx med en typdeklaration, så att TypeScript senare skulle varna mig om jag av misstag använde något som userTestStatus[3].nammme.
Svar #1
Du bör använda en inbyggd array istället för ett objektsliteral med sifferliknande egenskaper, så att numrering (samt många andra arrayfunktioner) tas om hand direkt.
Vad du letar efter här är en inline-gränssnittsdefinition för din array som definierar varje element i den arrayen, oavsett om det är närvarande från början eller introduceras senare:
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 [...]
Om du initialiserar din array med värden direkt är en explicit typdefinition inte nödvändig; TypeScript kan automatiskt härleda de flesta elementtyper från den initiala tilldelningen:
let userTestStatus = [
{ "id": 0, "name": "Available" },
...
];
userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]
Svar #2
Det du har ovan är ett objekt, inte en array.
För att skapa en array, använd [ & ] för att omge dina objekt.
userTestStatus = [
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
];
Förutom det är TypeScript en superset av JavaScript, så allt som är giltigt JavaScript kommer att vara giltigt TypeScript, så inga andra ändringar behövs.
Förtydligande av feedback från OP... i behov av en definition för den modell som publicerades
Du kan använda de typer som definieras här för att representera din objektmodell:
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
Vissa tslint-regler inaktiverar användning av [], exempelmeddelande: Array-typ som använder 'T[]' är förbjuden för icke-enkla typer. Använd 'Array<T>' istället.
Då skulle du skriva det så här:
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
Lite gammal men jag kände att jag kunde bidra med lite klarhet till detta.
Exakt 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 ovan är inte hur vi vanligtvis gör en array av objekt, du skulle använda den enkla inbyggda arrayen 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" }
];
Att helt enkelt lägga till [] till vårt gränssnitt ger typningen för en array av nämnda objekt. Och att göra det inline
let userTestStatus_inline: {id:number, name:string}[] = [
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
];
Jag skulle använda gränssnittet eftersom du har något som är definierbart, förståeligt och återanvändbart. Om du behöver göra ändringar kan du göra ändringar i det ena gränssnittet och TypeScript kommer att rapportera dina gränssnitt till kodmismatch.
Svar #6
Vad du verkligen vill ha kan helt enkelt vara en uppräkning
Om du letar efter något som beter sig som en uppräkning (eftersom jag ser att du definierar ett objekt och fäster ett sekventiellt ID 0, 1, 2 och innehåller ett namn-fält som du inte vill stava fel (t.ex. name vs naaame), är du bättre att definiera en uppräkning eftersom det sekventiella ID:t tas hand om automatiskt, och ger typverifiering åt dig direkt.
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
Värdena ovan kommer att mappas automatiskt, t.ex. "0" för "Available", och du kan komma åt dem med TestStatus.Available. Och Typescript kommer att upprätthålla typen när du använder dem.
Om du insisterar på att definiera en ny typ som en array av din egna typ
Du ville ha en array av objekt, (inte exakt ett objekt med nycklarna "0", "1" och "2"), så låt oss definiera typen av objektet först, och sedan typen av en innehållande 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")
]
