microsoft / microsoft/TypeScript

Pedantic: deny mutable type generalization

Offen
#39,915 3 Kommentare 9 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Awaiting More Feedback Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

Search Terms

type generalization
type expanding

Suggestion

Currently we have a vulnerability in type safety of mutable variables. You can generalize the type of some variable and change its value by passing there something not compatible with the old type. Examples:

const a: Array<number> = [1, 2]

const b: Array<number | string> = a

b.push('a is not array of numbers anymore')
const a = { data: 0 }

function b (param: { data: string | number }) {
  param.data = 'a is broken now'
}

b(a)

So I suggest adding a new compiler option under 'pedantic' label which will deny such type conversions:

const a: Array<number> = [1, 2]

// Error: type 'Array<number>' is not assignable to 'Array<number | string>'
const b: Array<number | string> = a
const a: Array<number> = [1, 2]

// OK: 'ReadonlyArray' won't let us mutate the state of 'a'
const b: ReadonlyArray<number | string> = a
const a = { foo: 0, bar: 'string' }

function b (param: { readonly foo: number | string, bar: string }) {
  param.bar = String(param.foo)
}

// OK
// property 'foo: number' is assignable to 'readonly foo: number | string'
// property 'bar: string' is assignable to 'bar: string'
b(a) 

function c (param: { readonly foo: number | string, bar: number | string }) {
  param.bar = String(param.foo)
}

// Error: property 'bar: string' is not assignable to 'bar: number | string'
c(a)

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Das Issue nennt keine Datei und keinen Test-Einstiegspunkt. Beginne damit zu überprüfen, wie Compileroptionen und Zuweisbarkeit behandelt werden, und vergleiche dann die Beispiele mit veränderlichen Arrays und Objekten mit den readonly-Fällen. Erledigt ist die Aufgabe, wenn eine pedantische Option die unsicheren veränderlichen Verallgemeinerungen ablehnt und gleichzeitig die beschriebenen readonly-Konvertierungen zulässt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
30/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.