Skip to content

Added typesafe generateId for typed deps#105

Merged
madimp merged 2 commits intodescript-org:masterfrom
AlexanderVasiliev:master
Apr 7, 2026
Merged

Added typesafe generateId for typed deps#105
madimp merged 2 commits intodescript-org:masterfrom
AlexanderVasiliev:master

Conversation

@AlexanderVasiliev
Copy link
Copy Markdown
Contributor

@AlexanderVasiliev AlexanderVasiliev commented Apr 1, 2026

Варианты использования, которые добавлены помимо старых

interface UserResult {
    id: number;
    name: string;
}

de.func({
    block: ({ generateId }) => {
        // самый гибкий: передать в generateId дженерик
        const userId = generateId<UserResult>();

        return de.object({
            block: {
                user: de.func({
                    block: async({ params }: { params: { userId: string } }) => {
                        await Promise.resolve(); // имитация async-логики перед созданием блока

                        return de.http({
                            block: { pathname: `/api/users/${ params.userId }` },
                            options: {
                                id: userId,
                                after: ({
                                    result,
                                }: {
                                    result: DescriptHttpBlockResult<UserResult>;
                                }) => {
                                    return result.result;
                                },
                            },
                        });
                    },
                }),

                cart: de.func({
                    block: () => ({ items: [], total: 0 }),
                    options: {
                        deps: userId,
                        before: ({ dep }) => {
                            const user = dep(userId);
                            return { userId: user.id };
                        },
                    },
                }),
            },
        });
    },
});
de.func({
    block: ({ generateId }) => {
        // наиболее частый кейс: передаем блок напрямую, descript сам выведет тип этого блока
        const userId = generateId(userBlock);

        const userBlockWithId = userBlock.extend({ options: { id: userId } });

        const cartBlock = de.func({
            block: (): CartResult => ({ items: [ 'apple' ], total: 10 }),
            options: {
                deps: userId,
                before: ({ dep }) => {
                    const user = dep(userId);
                    return { userId: user.id };
                },
                after: ({ dep, result }) => {
                    const user = dep(userId);
                    return { ...result, ownerName: user.name };
                },
            },
        });

        return de.object({ block: { user: userBlockWithId, cart: cartBlock } });
    },
});

@AlexanderVasiliev AlexanderVasiliev marked this pull request as ready for review April 1, 2026 12:43
@AlexanderVasiliev
Copy link
Copy Markdown
Contributor Author

This PR fixes #81

@madimp madimp merged commit faca19b into descript-org:master Apr 7, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants