Topic de RoadToSardine :

[HELP] Besoin d'un dev JS/TypeScript pour une petite question

Hello, je suis un peu bloqué, j'essaye d'utiliser une librairie (mirage.js, qui permet de simuler des appels HTTP vers un service) mais y a un truc que je ne comprends pas avec TypeScript (je viens de m'y mettre).
Si l'un de vous est dispo pour go MP ou Discord ou autre, merci beaucoup :coeur:
Sinon, si vous connaissez des communautés JS ça m’intéressera aussi pour leur poser la question.
C'est pleins de generics et ca ressemble pas du tout aux generics des langages fonctionnels ou objet, je suis paumax https://image.noelshack.com/fichiers/2021/27/4/1625748886-risitas-triste.png
Pour être plus précis, la stack :
- Vue
- TypeScript
- Mirage
L’élite est absente ce soir ? https://image.noelshack.com/fichiers/2021/27/4/1625748886-risitas-triste.png

Pourquoi go MP ou Discord ?

Tu peux pas directement poser la question ici ? Je pourrai sans doute pas y répondre mais TypeScript m'intéresse, ca pourra pe m'aider un jour.

Et t'auras plus de chances que les gens te répondent, personne n'a envie de go MP et lancer une discussion avec in inconnu pour juste potentiellement l'aider sur un sujet. C'est des efforts en plus pour pas grand chose.

Parce que sur le forum il est impossible de faire de la coloration syntaxique, du coup c'est moche a lire.
Je vais reproduire ça sur un JSFiddle, t'as raison :ok:
Envoie le composant ma loute. Je fais du TS souvent

Le 13 septembre 2022 à 22:53:21 mayonnaise_03 a écrit :
Envoie le composant ma loute. Je fais du TS souvent

"ma loute" t'es sérieux ? T'a cru le 18-25 c'est la bande à Babar ? https://image.noelshack.com/fichiers/2016/26/1467335935-jesus1.png

J'ai ces interfaces :

// src/interfaces/state.tsx
import { DateTime } from "luxon";

export interface Post {
  id: number;
  title: string;
  author: string;
  latest: DateTime;
  messages: Array<Message> | [];
}

export interface Message {
  id: number;
  author: string;
  date: DateTime;
  content: string;
}

Et ce server Mirage :

// src/server.tsx
import { createServer, Factory, Model } from "miragejs";
import { FactoryDefinition, ModelDefinition, Registry } from "miragejs/-types";
import Schema from "miragejs/orm/schema";
import { DateTime, Duration } from "luxon";
import { Post } from "@/interfaces/state";

const postFactory: FactoryDefinition<Post> = Factory.extend({
  id(i) {
    return i;
  },
  title(i) {
    return `Any test ${i}`;
  },
  author(i) {
    return `JohnDoe${i}`;
  },
  latest(i) {
    return DateTime.now().minus(
      Duration.fromMillis(Math.random() * i * 1000 * 60)
    );
  },
  messages: 0,
});

const PostModel: ModelDefinition<Post> = Model.extend({});

type PostRegistry = Registry<
  {
    post: typeof PostModel;
  },
  Record<string, never>
>;

type PostSchema = Schema<PostRegistry>;

export function makeServer({ environment = "development" } = {}) {
  return createServer({
    environment,

    models: {
      post: PostModel,
    },

    factories: {
      post: postFactory,
    },

    seeds(server) {
      server.createList("post", 10);
    },

    routes() {
      this.namespace = "api";
      this.timing = 100;

      this.get("/posts", (schema: PostSchema) => {
        return schema.all("post");
      });

      this.post("/posts", (schema: PostSchema, request) => {
        const body = JSON.parse(request.requestBody);

        const newPost: Post = {
          id: Math.floor(Math.random() * 100),
          title: body.title,
          author: "JohnDoe",
          messages: [
            {
              id: Math.floor(Math.random() * 100),
              author: "JohnDoe",
              content: body.message,
              date: DateTime.now(),
            },
          ],
          latest: DateTime.now(),
        };

        return schema.create("post", newPost);
      });
    },
  });
}

Mais la derniere ligne : schema.create("post", newPost) souligne newPost en rouge avec l'erreur :

TS2345: Argument of type 'Post' is not assignable to parameter of type 'Partial<ModelInitializer<Instantiate<PostRegistry, "post">>>'.
   Types of property 'id' are incompatible.
     Type 'number' is not assignable to type 'string | undefined'

Je comprends pas trop ce que je rate :(

id est type id!: number et tu essaie de l'affecter à un type string | undefined, je regarde en detail
Leur doc est la : https://miragejs.com/docs/main-concepts/shorthands/
Le create est cense prendre un objet du Model, que j'ai bien defini pour etre un PostModel: ModelDefinition<Post> :(

Le 13 septembre 2022 à 23:01:04 :
id est type id!: number et tu essaie de l'affecter à un type string | undefined, je regarde en detail

Oui j'ai l'impression que c'est un champ de Partial mais je comprends pas trop pourquoi je dois avoir un Partial alors que dans la doc on dirait qu'on peut directement passer un objet...

Le 13 septembre 2022 à 23:01:04 :
id est type id!: number et tu essaie de l'affecter à un type string | undefined, je regarde en detail

Punaise je viens de trouver: dans module:miragejs/-types.ModelInstance on peut voir

    create<
      K extends keyof Registry,
      Init extends Instantiate<Registry, K>,
      Data extends Partial<ModelInitializer<Init>>
    >(
      modelName: K,
      data?: Data
    ): Init & {
      [K in keyof Init & keyof Data]: Exclude<Init[K], undefined | null>;
    };

(Voir Init qui doit être Instantiante) :

  export type Instantiate<
    Registry,
    ModelName extends keyof Registry
  > = ModelInstance<
    {
      // Splitting and rejoining on `ModelName` ensures that unions distribute
      // properly, so that `Instantiate<Reg, 'foo' | 'bar'>` expands out like
      // `Instantiate<Reg, 'foo'> | Instantiate<Reg, 'bar'>` rather than something
      // that only has the intersection of `foo` and `bar`'s keys.
      [Model in ModelName]: {
        [Key in keyof Registry[Model]]: InstantiateValue<
          Registry,
          Registry[Model][Key]
        >;
      };
    }[ModelName]
  >;

Et ici, ModelInstance doit a déjà un id?: string:

  export type ModelInstance<Data extends {} = {}> = Data & {
    id?: string;
    attrs: Data;
    modelName: string;
tu type Post de ta const newPost objet custom il aime , met any a la place de Post pour voir si il continue de gueuler

Le 13 septembre 2022 à 23:10:26 :
tu type Post de ta const newPost objet custom il aime , met any a la place de Post pour voir si il continue de gueuler

C'est bon finalement, cf. le post au dessus, j'avais un conflit sur le nom, la librairie utilise deja id pour les objets du modèle.
Merci en tout cas mon khey, suffisait de lire le message comme tu l'as fait et chercher un peu plus bas dans les types :bravo:
Je ne referais pas l'erreur :merci:

fais ca ?

export interface Post {
id?: string; => ici ?
title: string;
author: string;
latest: DateTime;
messages: Array<Message> | [];
}

Données du topic

Auteur
RoadToSardine
Date de création
13 septembre 2022 à 22:39:13
Nb. messages archivés
30
Nb. messages JVC
30
En ligne sur JvArchive 240