Sealious problem z typami?

Sealious na tym etapie to ewidentnie moja ulubiona kategoria. Tym razem piszę z potencjalnym błędem w typownaiu. Probelm jest taki, kolekcja wygląda tak

import { App, Collections, FieldTypes, Policies } from "sealious";

class Users extends Collections.users {
    fields = {
        ...App.BaseCollections.users.fields,
        photo: new FieldTypes.File(),
        name: FieldTypes.Required(new FieldTypes.Text()),
        surname: FieldTypes.Required(new FieldTypes.Text()),
        email: FieldTypes.Required(new FieldTypes.Email()),
        roles: new FieldTypes.ReverseSingleReference({
            referencing_collection: "user-roles",
            referencing_field: "user",
        }),
    };

    policies = {
        list: new Policies.Public(),
    };

    defaultPolicy = new Policies.Public();
}

export default new Users();

Jak widać są tu opcjonalne pola takie jak photo. I teraz jeśli chce stworzyć użytkownika w ten sposób

const user = await ctx.$app.collections.users.suCreate({
            password: "paste-random-password-here",
            // photo:create imgae and insert photo here
            // username: ctx.$body.username || (ctx.$body.name as string).toLowerCase(),
            name: ctx.$body.name as string,
            surname: ctx.$body.surname as string,
            email: ctx.$body.email as string,
            photo: undefined,
            roles: [],
        });

To dostane błąd, że Type 'undefined' is not assignable to type 'File'. na polu photo. By ten błąd znikł wystarczy użuć create zamiast suCreate

 const user = await ctx.$app.collections.users.create(ctx.$context, {
            password: "paste-random-password-here",
            // photo:create imgae and insert photo here
            // username: ctx.$body.username || (ctx.$body.name as string).toLowerCase(),
            name: ctx.$body.name as string,
            surname: ctx.$body.surname as string,
            email: ctx.$body.email as string,
            photo: undefined,
            roles: [],
        });

Również, jeśli nie podam tego pola w suCreate to pokazuje, że go brakuje. Wydaje mi się, że te pole powinno być opcjonalne w obu przypadkach jako, że kolekcja nie mówi, że jest potrzebne?

Czy może ktoś potwierdzić ten sam problem u siebie? Jeśli tak to pewnie powinniśmy stworzyć na to taska :smiley:

Jestem na wersji 0.14.10 specjalnie zupdateowałem, żeby zobaczyć czy zniknie problem

Nice find. Typy dla argumentów funkcji create i suCreate są rożne. suCreate ma luźniejsze typy:

async suCreate(data: ItemFields<this>): Promise<CollectionItem<this>> 

async create(
	context: Context,
	data: Partial<ItemFields<this>>
): Promise<CollectionItem<this>>

suCreate przyjmuje ItemFields<this>, a create zawija to jeszcze w Partial, które pozwala na przyjmowanie niepełnych obiektów. Trzeba wybrać bardziej spójną opcję, aby typy nie były tutaj przeszkodą. Najlepiej, aby ItemFields zdawał sobie sprawę, które pola są wymagane, a które nie. Zaraz zrobię draft rozwiązania

Ok, zmienione w nowej wersji Sealiousa, zaktualizuj do 0.15.0.

Ten commit był… trudniejszy, niż się spodziewałem :sweat_smile:

1 Like

Changes (101)

Faktycznie dosyć spory xD

1 Like