Angiv variabeltype efter den oprindelige erklæring typescript


Jeg har følgende kode:

let item = object[] | object;
if (a === true) {
    item = [];
    // would like to do something like item: object[] = []
    (item as object[]).push(...);
else if (b === true) {
    item = {};
    // would like to do something like item: object = {}
    (item as any).prop = ...
}
// do stuff with item

Mit problem er, at fordi item kan være enten et objekt eller en liste af objekter, bliver jeg nødt til at caste item, for at Typescript tillader mig at arbejde med det. Er der nogen måde at erklære objektets type ved dets initialisering, så disse casts er unødvendige?

Bare for at præcisere, jeg VIL have item til at være typet, jeg vil bare have, at den typning skal specificeres, efter det er defineret.

Svar #1

Det idiom, jeg er fortrolig med, er at erklære en midlertidig variabel med en mere snævert defineret type og derefter tildele den tilbage til variablen med en bredere type. For eksempel:

type IndexableObject = { [k: string]: any };
let item: IndexableObject[] | IndexableObject;
declare let a: boolean;
declare let b: boolean;
if (a === true) {
    let itemArray: IndexableObject[] = [];
    itemArray.push({ hey: 'you' }, { whats: 'up' });
    item = itemArray;    
} else if (b === true) {
    let itemObject: IndexableObject = {};
    itemObject.prop = 'hello';
    item = itemObject;
}

Jeg ved, at du helst ikke vil introducere en sådan variabel, men min erfaring er, at alt andet blot er at kæmpe med TypeScript, hvilket som regel er frugtesløst. Held og lykke!

REDIGER: Det ser ud til, at du grundlæggende støder på denne situation. Som du kan se i det GitHub-problem, overvejer ingen engang at implementere den slags typeindsnævring i kontrolflowet, som du ønsker. Så den midlertidige variabel er den eneste rimelige måde at gå på, så vidt jeg kan se.

Svar #2

Du kunne bruge Type Assertion, sådan her:

let item: Any 
if ( some condition ) {
let mynewtype = (item as string)
// use mynewtype as string }

Relaterede artikler