Typographie comment taper le reste des paramètres dans l'objet

Nov 26 2020
  function test(data){
      console.log(data)
  }

  test({comments: 'hi', eat: true, sleep: true})

Dans la fonction de test, je suis sûr que l'argument de commentaire apparaîtra, où, comme pour les autres arguments, les propriétés peuvent être dynamiques mais la valeur sera de type booléen,

  test({comments: 'hi', drink: true, sleep: true})

compte tenu de cette situation, comment dois-je taper correctement les données? J'ai essayé quelque chose comme ça, mais ça semble faux

function(data: {data: {comments: string, [key: string]: boolean})

Réponses

1 НиколайГольцев Nov 26 2020 at 17:55

Je peux vous suggérer une sorte de solution de contournement:

function test<T extends {
  [key: string]: any;
}>(data: { comments: unknown } & { [key in keyof T]: key extends "comments" ? string : boolean }) {
  const comments = data.comments as string;
  console.log(comments);
  console.log(data.eat);
  console.log(data.sleep);
}

test({comments: "hi"}); // works
test({comments: "hi", eat: true}); // works
test({comments: true}); // doesn't works
test({comments: 5}); // doesn't works
test({comments: "hi", eat: "true"}); // doesn't works
test({comments: "hi", eat: 5}); // doesn't works

Il tapait bien en dehors du corps de la fonction, mais dans le corps de la fonction pour taper data.commentscorrectement, vous devez ajouter un rétrécissement.