grammatikk - Hvorfor er skilletegnet i en TypeScript TypeMemberList semikolon i stedet for komma?


Dette er et TypeScript-grensesnitt:

interface A {
    l: { x: string; y:number }
}

Men dette (lignende ting) gir en feil:

interface A {
    l: { x: string, y:number }
}

// => Error: ';' expected.

På s.37 i spesifikasjonen: http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf

Jeg ser at det faktisk er spesifisert at en ; skal vises der, men som JavaScript-bruker ser semikolonet midt i objekt-lignende tingen feil ut.

Ble denne avgjørelsen tatt for å unngå tvetydighet i parseren, eller av en annen grunn?

Svar #1

Fra og med TypeScript 1.6 eller deromkring, kan du nå bruke enten , eller ; som skilletegn i interface-deklarasjoner eller anonyme objekttyper! Teamet besluttet at fleksibiliteten til å bruke den ene eller den andre oppveide bekymringene som er nevnt i 'gammelt svar'-delen.

Du må fortsatt bruke ; i klassedeklarasjoner for å fjerne tvetydighet:

x = 3;
class X {
  // Could be parsed as expression with comma operator,
  // or two declarations
  y = 1, x = 3;
}

Jeg har beholdt det gamle svaret nedenfor for historisk kontekst

Gammelt svar

Teknisk sett kunne det gått på begge måter, men det finnes mange sterke grunner til å bruke semikolon.

I programmeringsspråk er det mer vanlig å se semikolon som markerer slutten av linjer og komma som skiller ting innenfor en linje (det finnes noen få unntak fra dette, som enum). De fleste TypeScript-typer er store nok til at de går over flere linjer, noe som gjør semikolon til et bedre valg.

Det er også et ønske om at grensesnitt og klasser skal fremstå på en lignende måte. Tenk på noe som dette:

interface Point {
    x: number;
    y: number;
}
class MyPoint {
    x: number;
    y: number;
}

Det er mye enklere å få MyPoint til å implementere Point via kopier-og-lim, eller å endre noe fra et grensesnitt til en klasse eller omvendt, hvis de bruker samme skilletegn. Man kan vel hevde at man kunne ha gjort komma til skilletegnet i klasse-deklarasjoner, men det er vanskelig å selge som den første programmeringsspråket i vanlig bruk som gjør det.

Det er også ønskelig å kunne skille objektliteraler og typeliteral på et øyekast. Mens den enkle medlem { x: string } kan være begge deler avhengig av kontekst, er det litt bedre om du kan skille dem basert på skilletegnet når konteksten ikke er åpenbar i et komplekst uttrykk.

Endelig bruker alle andre språk i vanlig bruk med en interface-syntaks semikolon. Når du er i tvil, følg konvensjonen, og syntaksen for en type-literal og et grensesnitt bør definitivt bruke samme avgrensningstegn.

Svar #2

Fra og med TypeScript 5.2.2 kan du utelate skilletegnet helt. Dette er korrekt:

type Circle = {
    x: number  // look ma, no comma or semicolon or anything
    y: number
    r: number
}

const c: Circle = {
    x: 0,
    y: 0,
    r: 1
}

console.log(c);

Direkte demo

Relaterte artikler