Skip to content

Commit c75f9fa

Browse files
committed
Fix model typing
1 parent be62d81 commit c75f9fa

File tree

4 files changed

+28
-24
lines changed

4 files changed

+28
-24
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- Fix model typing
13+
1014
## [0.2.0-beta.6] - 2024-12-05
1115

1216
### Changed

src/model.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { JsonApiResource, ModelForType, SchemaCollection } from './types';
1+
import { JsonApiResource, SchemaCollection } from './types';
22
import { Store } from './store.ts';
33

4-
class ModelBase<Schema extends JsonApiResource = JsonApiResource> {
4+
class ModelBase<
5+
Schema extends JsonApiResource = JsonApiResource,
6+
Schemas extends SchemaCollection = SchemaCollection,
7+
> {
58
public type: Schema['type'];
69
public id: Schema['id'];
710
public attributes: NonNullable<Schema['attributes']> = {};
@@ -11,7 +14,7 @@ class ModelBase<Schema extends JsonApiResource = JsonApiResource> {
1114

1215
constructor(
1316
data: Schema,
14-
protected store: Store,
17+
protected store: Store<Schemas>,
1518
) {
1619
this.type = data.type;
1720
this.id = data.id;
@@ -103,7 +106,7 @@ class ModelBase<Schema extends JsonApiResource = JsonApiResource> {
103106

104107
type ProxiedModel<
105108
Schema extends JsonApiResource,
106-
Schemas extends Record<string, JsonApiResource>,
109+
Schemas extends SchemaCollection,
107110
> = Schema &
108111
Schema['attributes'] & {
109112
[Property in keyof NonNullable<Schema['relationships']>]?: NonNullable<
@@ -131,3 +134,19 @@ export const Model: new <
131134
data: JsonApiResource<Schema['type']>,
132135
store: Store<Schemas>,
133136
) => Model<Schema, Schemas> = ModelBase as any;
137+
138+
export type ModelMap<Schemas extends SchemaCollection = SchemaCollection> = {
139+
[Type in keyof Schemas & string]?: new (
140+
data: JsonApiResource<Type>,
141+
store: Store<Schemas>,
142+
) => Schemas[Type];
143+
};
144+
145+
export type ModelForType<
146+
Type extends string,
147+
Schemas extends SchemaCollection,
148+
> = Type extends keyof Schemas
149+
? Schemas[Type] extends ModelBase<JsonApiResource<Type>, Schemas>
150+
? Schemas[Type]
151+
: Model<JsonApiResource<Type>, Schemas>
152+
: Model<JsonApiResource<Type>, Schemas>;

src/store.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import { Model } from './model';
1+
import { Model, ModelForType, ModelMap } from './model';
22
import {
33
JsonApiDocument,
44
JsonApiIdentifier,
55
JsonApiResource,
6-
ModelForType,
7-
ModelMap,
86
SchemaCollection,
97
} from './types';
108

src/types.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import { Model } from './model.ts';
2-
import { Store } from './store.ts';
3-
41
export interface JsonApiDocument<Type extends string = string> {
52
data: JsonApiResource<Type> | JsonApiResource<Type>[] | null;
63
included?: JsonApiResource[];
@@ -40,17 +37,3 @@ export interface JsonApiRelationshipToMany<Type extends string = string>
4037
}
4138

4239
export type SchemaCollection = { [Type in string]: JsonApiResource<Type> };
43-
44-
export type ModelMap<Schemas extends SchemaCollection = SchemaCollection> = {
45-
[Type in keyof Schemas & string]?: new (
46-
data: JsonApiResource<Type>,
47-
store: Store<Schemas>,
48-
) => Schemas[Type];
49-
};
50-
51-
export type ModelForType<
52-
Type extends string,
53-
Schemas extends SchemaCollection,
54-
> = Type extends keyof Schemas
55-
? Model<Schemas[Type], Schemas>
56-
: Model<JsonApiResource<Type>, Schemas>;

0 commit comments

Comments
 (0)