[HELP] Besoin d'un dev JS/TypeScript pour une petite question
Si l'un de vous est dispo pour go MP ou Discord ou autre, merci beaucoup
![:coeur: :coeur:](https://jvarchive.com/static/smileys/:coeur:.gif)
Sinon, si vous connaissez des communautés JS ça m’intéressera aussi pour leur poser la question.
- Vue
- TypeScript
- Mirage
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.
Je vais reproduire ça sur un JSFiddle, t'as raison
![:ok: :ok:](https://jvarchive.com/static/smileys/:ok:.gif)
![:ok: :ok:](https://jvarchive.com/static/smileys/:ok:.gif)
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
Le
create
est cense prendre un objet du Model
, que j'ai bien defini pour etre un PostModel: ModelDefinition<Post>
![:( :(](https://jvarchive.com/static/smileys/:(.gif)
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;
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
Je ne referais pas l'erreur
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