microsoft / microsoft/TypeScript

Optional fields affecting keyof operator in generic class decorators

Ouverte
#29,222 4 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Domain: Mapped Types In Discussion Suggestion
Langage dominant
Go
Étoiles
111k
Forks
14.3k
Merge moyen
2 j 4 h
PR mergées (30 j)
132

Description

TypeScript Version: 3.2.2

Search Terms:
class decorator keyof typescript

Code

function View<T>(name: string, fields: (keyof T)[]) {
  return (target: new(...args: any[]) => T) => {
    // Do something with fields
  };
}

// works
@View('active', ['street1', 'street2'])
class Address {
  street1: string;
  street2: string;
}

// broken
@View('active', ['street1', 'street2'])
class AddressBroken {
  street1: string;
  street2?: string;
}

Expected behavior:
Both scenarios should work above.

Actual behavior:
It appears that optional fields are causing the decorator to create invalid types.

Argument of type 'typeof AddressBroken' is not assignable to parameter of type 'new (...args: any[]) => { street1: any; street2: any; }'.
  Type 'AddressBroken' is not assignable to type '{ street1: any; street2: any; }'.
    Property 'street2' is optional in type 'AddressBroken' but required in type '{ street1: any; street2: any; }'.
1234

Playground Link:
Playground Sample

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par l’exemple Playground lié et reproduisez l’erreur de décorateur impliquant keyof, les classes génériques et un champ optionnel. Suivez le traitement par le compilateur du type cible du décorateur, puis ajoutez un test de régression couvrant à la fois Address et AddressBroken et vérifiez que les deux exemples sont compilés sans l’erreur signalée.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.