sbkl
sbkl3mo ago

Sharded-counter type error

Taking for the doc example:
const friendCounts = new ShardedCounter<Record<Id<"users">, number>>(
components.shardedCounter,
{ defaultShards: 1 },
);
const friendCounts = new ShardedCounter<Record<Id<"users">, number>>(
components.shardedCounter,
{ defaultShards: 1 },
);
I get a type error:
Type 'Record<Id<"users">, number>' does not satisfy the constraint 'string'.ts(2344)
Type 'Record<Id<"users">, number>' does not satisfy the constraint 'string'.ts(2344)
Any idea? Below my tsconfig
{
/* This TypeScript project config describes the environment that
* Convex functions run in and is used to typecheck them.
* You can modify it, but some settings are required to use Convex.
*/
"compilerOptions": {
/* These settings are not required by Convex and can be modified. */
"allowJs": true,
"strict": true,
"moduleResolution": "Bundler",
"jsx": "react-jsx",
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": true,
"noUnusedParameters": true,

/* These compiler options are required by Convex */
"target": "ESNext",
"lib": ["ES2021", "dom"],
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"isolatedModules": true,
"noEmit": true
},
"include": ["./**/*", "prices/.ts"],
"exclude": ["./_generated"]
}
{
/* This TypeScript project config describes the environment that
* Convex functions run in and is used to typecheck them.
* You can modify it, but some settings are required to use Convex.
*/
"compilerOptions": {
/* These settings are not required by Convex and can be modified. */
"allowJs": true,
"strict": true,
"moduleResolution": "Bundler",
"jsx": "react-jsx",
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": true,
"noUnusedParameters": true,

/* These compiler options are required by Convex */
"target": "ESNext",
"lib": ["ES2021", "dom"],
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"isolatedModules": true,
"noEmit": true
},
"include": ["./**/*", "prices/.ts"],
"exclude": ["./_generated"]
}
3 Replies
Convex Bot
Convex Bot3mo ago
Thanks for posting in <#1088161997662724167>. Reminder: If you have a Convex Pro account, use the Convex Dashboard to file support tickets. - Provide context: What are you trying to achieve, what is the end-user interaction, what are you seeing? (full error message, command output, etc.) - Use search.convex.dev to search Docs, Stack, and Discord all at once. - Additionally, you can post your questions in the Convex Community's <#1228095053885476985> channel to receive a response from AI. - Avoid tagging staff unless specifically instructed. Thank you!
erquhart
erquhart2mo ago
That's a docs error, the type has to extend string. You can do ShardedCounter<Id<"users">> instead.
sbkl
sbklOP2mo ago
Oh great thanks. With string literal, you can even namespace by document id and specific counter. This kind of example would be great to add to the docs.
import { components } from "../_generated/api";
import { Id } from "../_generated/dataModel";
import { z } from "zod";

const priceListCounterTypeValue = z.union([
z.literal("materialRowCount"),
z.literal("marginRowCount"),
z.literal("priceRowCount"),
]);

export const priceListCounter =
new ShardedCounter<`${Id<"priceLists">}:${z.infer<typeof priceListCounterTypeValue>}`>(
components.priceListCounter
);
import { components } from "../_generated/api";
import { Id } from "../_generated/dataModel";
import { z } from "zod";

const priceListCounterTypeValue = z.union([
z.literal("materialRowCount"),
z.literal("marginRowCount"),
z.literal("priceRowCount"),
]);

export const priceListCounter =
new ShardedCounter<`${Id<"priceLists">}:${z.infer<typeof priceListCounterTypeValue>}`>(
components.priceListCounter
);

Did you find this page helpful?