microsoft / microsoft/TypeScript

Generic type can't be assigned to the same DeepReadonly type

Aperta
#32,198 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Domain: Mapped Types
Lingua principale
Go
Stelle
111k
Fork
14.3k
Merge medio
2g 4h
PR unite (30g)
132

Descrizione

Assigning generic type T to it's deep readonly DeepReadonly<T> cause error however shallow Readonly<T> works fine. Also I found that known types do work well with DeepReadonly .

TypeScript Version: 3.4.0-dev.201xxxxx

Search Terms:
DeepReadonly assign return generic nested readonly

Code

// Simple deep readonly
export type DRO<T> = { readonly [P in keyof T]: DR<T[P]> };
type DR<T> = T extends object ? DRO<T> : T;

// Sample type
interface TMP {
  a: number;
  b: {
    c: boolean;
  };
}

// Works fine
const a: TMP = { a: 10, b: { c: false } };
const b: DRO<TMP> = a;

// Doesn't work
class X<T> {
  constructor(private readonly t: T) {}

  foo(): DRO<T> {
    // Error here
    return this.t; 
  }

  bar(): Readonly<T> {
    // Works fine
    return this.t;
  }
}

Expected behavior:
Method foo shouldn't have error

Actual behavior:
Error: Type 'T' is not assignable to type 'DRO'.

Playground Link:
https://www.typescriptlang.org/play/#code/PTAEGUEsFsAcBsCmoAmjG1AJ0QQxQPYB28AngFCIAesBWALqPabMgCIBKA8gDwAqAPlABeUAG9seQiVKgA2gAVQkIqADWiUgQBmoPgF0AXKE79F+oQF8A3OWasTHfkNF9Q1eoiIoAzqAIARgBWiADGjAD8jryCoMZ8tuQgELhwSEwsiOQqnljauKHIfACySmLkoKC4xkQArtABiFi2lQHG5ZWVocYBBARIuEQtoDbkluRJYADqdGp+2ipZocQ+jNV6pSLiVcYAjAAMADSgbdvdoPnwPsiWI7bLRKsnxpwxpS5ViclsBIg+RAByRgAd1m5FC8FwPj8AA1nOIKqAHqssLVwnQABSwLCQABuuE8knwxDITHiAEpxONEdo+hjyS9uPCOp1kgBRLBYOigAAWTSynUk9FqWFU9B5kB8ADp6NZQIjqa1cFh6cYOFISaRmYjKskZlg5hdFjqhSKxRLpbKFWMgA

Related Issues:
Maybe: #12826 and #21919

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con la riproduzione in TypeScript Playground e confronta il suo comportamento con quello della versione di TypeScript indicata o di una build corrente. Analizza l’assegnazione generica da T a DRO, insieme ai casi concreti e Readonly funzionanti. Il lavoro è completato quando il metodo generico foo segnalato non produce più l’errore indicato senza introdurre regressioni nei casi esistenti.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
typescript
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Specificata chiaramente
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.