kielioppi - Miksi TypeScriptin TypeMemberListissä erottimena on puolipiste eikä pilkku?
Tämä on TypeScript-liittymä:
interface A {
l: { x: string; y:number }
}
Mutta tämä (samankaltainen asia) aiheuttaa virheen:
interface A {
l: { x: string, y:number }
}
// => Error: ';' expected.
Sivulla 37 spesifikaatiossa: http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
Näen, että on tosiaan määritelty, että sinne pitäisi tulla ;, mutta JavaScriptistä tulleena puolipiste objektin-tyyppisen jutun keskellä näyttää väärältä.
Tehtiinkö tämä päätös välttääkseen epäselvyyttä jäsentimessä vai jostain muusta syystä?
Vastaus #1
TypeScript 1.6:n tienoilla voit nyt käyttää joko , tai ; rajaimena interface-määritelmissä tai anonyymeissä objektityypeissä! Tiimi päätti, että joustavuus käyttää jompaakumpaa ylitti 'vanhan vastauksen' osiossa luetellut huolenaiheet.
Sinun tulee silti käyttää ; luokkien ilmoituksissa ambiguiteetin poistamiseksi:
x = 3;
class X {
// Could be parsed as expression with comma operator,
// or two declarations
y = 1, x = 3;
}
Olen säilyttänyt alla olevan vanhan vastauksen historiallisessa kontekstissa
Vanha vastaus
Teknisesti se olisi voinut mennä kumpaan suuntaan tahansa, mutta on monia vahvoja syitä käyttää puolipisteitä.
Ohjelmointikielissä on yleisempää nähdä puolipisteitä merkitsemässä rivien loppuja ja pilkkuja erottamassa asioita rivin sisällä (tähän on joitain poikkeuksia, kuten enumit). Suurin osa TypeScriptin tyypeistä on tarpeeksi suuria kattamaan useita rivejä, mikä tekee puolipisteestä paremman valinnan.
On myös halu saada rajapinnat ja luokat näyttämään samankaltaisilta. Harkitse jotain tällaista:
interface Point {
x: number;
y: number;
}
class MyPoint {
x: number;
y: number;
}
On paljon helpompaa saada MyPoint toteuttamaan Point kopioi-ja-liitä -menetelmällä, tai muuttaa jotain rajapinnasta luokaksi tai päinvastoin, jos ne käyttävät samaa erotinta. Voisi perustellusti sanoa, että luokkailmoituksissa kunne olla pilkku erottavana merkkinä, mutta on vaikea saada aikaiseksi, että ensimmäinen yleisesti käytetty ohjelmointikieli tekisi näin.
On myös toivottavaa pystyä erottamaan objektilitteraalit ja tyypin litteraalit yhdellä silmäyksellä. Vaikka yksijäseninen { x: string } voisi olla kumpi tahansa kontekstista riippuen, on jonkin verran mukavampaa, jos ne voi erottaa erottimensa perusteella silloin, kun konteksti ei ole ilmeinen monimutkaisessa lausekkeessa.
Lopuksi, kaikki muut yleisesti käytössä olevat kielet, joissa on interface-syntaksi, käyttävät puolipistettä. Epävarmuuden sattuessa noudata konventiota, ja tyypin literaalin ja rajapinnan syntaksin tulisi varmasti käyttää samaa erottelumerkkiä.
Vastaus #2
TypeScript 5.2.2:sta lähtien voit jättää erottimen kokonaan pois. Tämä on oikein:
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);
Live-esittely
