Object literal may only specify known properties

Hi, having an issue where calling an operation to create user comments doesn't work due to issues with typescript. I currently have this as the function definition export const createComment: CreateComment = async ({ fileId, content }, context: any) => { // code to create user comments here given a fileId and the content }) Where I also set the type for CreateComment as: type CreateComment = (args: { fileId: string; content: string }, context: any) => Promise<CommentWithUser>; type CommentWithUser = Comment & { user: { id: string; username: string; }; }; and extra note is the main.wasp has the correct definition: action createComment { fn: import createComment from "@src/featured-creations/operations", entities: [Comment, User, File], } -- My question is, why is it giving me type errors, when I have both, the fileId, and the content, defined as arguments within the CreateComment type as shown above? [ Wasp ] ext-src/featured-creations/FeaturedCreationsPage.tsx(65,56): error TS2353: Object literal may only specify known properties, and 'content' does not exist in type '{ fileId: string; }'. I tried running wasp clean to see if it was an issue with outdated build files but to no success. Appreciate any assistance Thanks, Apex
13 Replies
kapa.ai
kapa.ai2mo ago
Hi @ApexFossa45. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- Thank you for your question about Wasp and TypeScript, Apex. It seems you're encountering a type error when trying to create a comment using an action. Let's analyze the issue based on the information provided in the knowledge sources. The error you're seeing suggests that TypeScript is expecting an object with only a fileId property, but you're trying to pass both fileId and content. This mismatch is likely due to how Wasp generates types for actions. In Wasp, when you define an action, it automatically generates TypeScript types for you. These types are used to ensure full-stack type safety. However, it appears that the generated type for your createComment action doesn't match the type you've manually defined. To resolve this issue, you should use the automatically generated type provided by Wasp instead of manually defining the CreateComment type. Here's how you can modify your code:
import { CreateComment } from 'wasp/server/operations'

export const createComment: CreateComment<{ fileId: string; content: string }, CommentWithUser> = async (
{ fileId, content },
context
) => {
// code to create user comments here given a fileId and the content
}
import { CreateComment } from 'wasp/server/operations'

export const createComment: CreateComment<{ fileId: string; content: string }, CommentWithUser> = async (
{ fileId, content },
context
) => {
// code to create user comments here given a fileId and the content
}
This approach uses the CreateComment type generated by Wasp, which you can import from 'wasp/server/operations'. You can specify the input type ({ fileId: string; content: string }) and the return type (CommentWithUser) as generic parameters to this type. By using the Wasp-generated type, you ensure that the types on the server-side match what Wasp expects, which should resolve the TypeScript error you're encountering. This solution is based on the information provided in the Wasp documentation on implementing actions (https://wasp-lang.dev/docs/data-model/operations/actions#example-1) and the GitHub issue discussing full-stack type support for queries and actions (https://github.com/wasp-lang/wasp/issues/910). If you're still encountering issues after making this change, it might be worth checking if there are any discrepancies between your .wasp file declaration and your TypeScript implementation. Also, ensure that you're using the latest version of Wasp, as type support has been improved in recent updates. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @ApexFossa45, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
ApexFossa45
ApexFossa45OP2mo ago
I got it, but it didn't solve my problem. even after the addition of the wasp provided type @kapa.ai It didnt resolve the issue, even after adding the wasp provided type
kapa.ai
kapa.ai2mo ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- I apologize that the previous suggestion didn't resolve your issue. Let's try to dig deeper into the problem. Based on the error message you provided earlier:
[ Wasp ] ext-src/featured-creations/FeaturedCreationsPage.tsx(65,56): error TS2353: Object literal may only specify known properties, and 'content' does not exist in type '{ fileId: string; }'.
[ Wasp ] ext-src/featured-creations/FeaturedCreationsPage.tsx(65,56): error TS2353: Object literal may only specify known properties, and 'content' does not exist in type '{ fileId: string; }'.
It seems that the error is occurring in your client-side code (FeaturedCreationsPage.tsx), not in the server-side implementation of the action. This suggests that the issue might be related to how you're calling the action from the client side. Let's review how you should be using the action on the client side: 1. First, make sure you're importing the action correctly in your React component:
import { createComment } from 'wasp/client/operations'
import { createComment } from 'wasp/client/operations'
2. When calling the action, make sure you're passing an object with both fileId and content:
const result = await createComment({ fileId: 'someFileId', content: 'Some comment content' })
const result = await createComment({ fileId: 'someFileId', content: 'Some comment content' })
If you're still getting the same error, it's possible that there's a mismatch between the action declaration in your .wasp file and the generated types. Let's double-check your .wasp file:
action createComment {
fn: import createComment from "@src/featured-creations/operations",
entities: [Comment, User, File],
}
action createComment {
fn: import createComment from "@src/featured-creations/operations",
entities: [Comment, User, File],
}
This looks correct, but make sure that the path to your operations file is accurate. If you're still encountering issues, it might be helpful to: 1. Double-check that you've run wasp start to ensure all the latest types are generated. 2. Try explicitly typing the argument in your client-side code:
const result = await createComment({ fileId: 'someFileId', content: 'Some comment content' } as const)
const result = await createComment({ fileId: 'someFileId', content: 'Some comment content' } as const)
If none of these suggestions resolve the issue, it would be helpful to see: 1. The exact code where you're calling the createComment action in your FeaturedCreationsPage.tsx 2. The full error message and stack trace Without more context, it's challenging to pinpoint the exact cause of the persistent error. If you're still stuck, you might want to consider opening an issue on the Wasp GitHub repository (https://github.com/wasp-lang/wasp/issues) or seeking help in the Wasp Discord community (https://discord.com/channels/686873244791210014/1213883204889612400), where the developers might be able to provide more specific assistance. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @ApexFossa45, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
ApexFossa45
ApexFossa45OP2mo ago
can I get a hand @Wasp Team ? Still having issues, everything looks correct, i've tried wasp cleaning many times now and changed content to comment to see, but no success
MEE6
MEE62mo ago
Wohooo @ApexFossa45, you just became a Waspeteer level 1!
ApexFossa45
ApexFossa45OP2mo ago
@kapa.ai I see, its because i am exporting as default another action, LikeFile, that only takes in fileId. how do I export all functions? to retain the correct types? or import them correctly?
kapa.ai
kapa.ai2mo ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- Ah, I see. Thank you for providing that additional context. It seems the issue is related to how you're exporting and importing your actions. Let's address this based on Wasp's recommended practices. In Wasp, it's generally recommended to use named exports for your actions rather than default exports. This allows you to export multiple actions from the same file and import them correctly while retaining their types. Here's how you can modify your code: 1. In your operations file (e.g., @src/featured-creations/operations.ts), use named exports for all your actions:
import { CreateComment, LikeFile } from 'wasp/server/operations'

export const createComment: CreateComment<{ fileId: string; content: string }, CommentWithUser> = async (
{ fileId, content },
context
) => {
// Implementation for createComment
}

export const likeFile: LikeFile<{ fileId: string }, void> = async (
{ fileId },
context
) => {
// Implementation for likeFile
}
import { CreateComment, LikeFile } from 'wasp/server/operations'

export const createComment: CreateComment<{ fileId: string; content: string }, CommentWithUser> = async (
{ fileId, content },
context
) => {
// Implementation for createComment
}

export const likeFile: LikeFile<{ fileId: string }, void> = async (
{ fileId },
context
) => {
// Implementation for likeFile
}
2. In your .wasp file, update the action declarations to use named imports:
action createComment {
fn: import { createComment } from "@src/featured-creations/operations",
entities: [Comment, User, File],
}

action likeFile {
fn: import { likeFile } from "@src/featured-creations/operations",
entities: [File, User],
}
action createComment {
fn: import { createComment } from "@src/featured-creations/operations",
entities: [Comment, User, File],
}

action likeFile {
fn: import { likeFile } from "@src/featured-creations/operations",
entities: [File, User],
}
3. When importing these actions on the client side (e.g., in your FeaturedCreationsPage.tsx), use named imports:
import { createComment, likeFile } from 'wasp/client/operations'
import { createComment, likeFile } from 'wasp/client/operations'
By using named exports and imports, you ensure that each action retains its correct type information, and you can export and use multiple actions from the same file without conflicts. This approach is consistent with the examples provided in the Wasp documentation on implementing actions (https://wasp-lang.dev/docs/data-model/operations/actions#example-1) and aligns with the general JavaScript/TypeScript best practices for module exports. If you make these changes, it should resolve the typing issues you're experiencing while allowing you to use both createComment and likeFile actions correctly. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @ApexFossa45, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
ApexFossa45
ApexFossa45OP2mo ago
got it, thanks, it kinda works. but now it says its missing a deafult export. it says it has no default export @kapa.ai
kapa.ai
kapa.ai2mo ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- I'm glad we're making progress, but I apologize for the new issue you're encountering. Let's address this "missing default export" problem. The error you're seeing about missing a default export is likely due to a mismatch between how you're exporting the actions in your operations file and how Wasp is trying to import them in the generated code. To resolve this, you need to ensure that your exports in the operations file match exactly what Wasp expects based on your .wasp file declarations. Here's how you can fix it: 1. In your .wasp file, make sure your action declarations use named imports like this:
action createComment {
fn: import { createComment } from "@src/featured-creations/operations",
entities: [Comment, User, File],
}

action likeFile {
fn: import { likeFile } from "@src/featured-creations/operations",
entities: [File, User],
}
action createComment {
fn: import { createComment } from "@src/featured-creations/operations",
entities: [Comment, User, File],
}

action likeFile {
fn: import { likeFile } from "@src/featured-creations/operations",
entities: [File, User],
}
2. In your operations file (e.g., @src/featured-creations/operations.ts), use named exports for your actions:
import { CreateComment, LikeFile } from 'wasp/server/operations'

export const createComment: CreateComment<{ fileId: string; content: string }, CommentWithUser> = async (
{ fileId, content },
context
) => {
// Implementation for createComment
}

export const likeFile: LikeFile<{ fileId: string }, void> = async (
{ fileId },
context
) => {
// Implementation for likeFile
}
import { CreateComment, LikeFile } from 'wasp/server/operations'

export const createComment: CreateComment<{ fileId: string; content: string }, CommentWithUser> = async (
{ fileId, content },
context
) => {
// Implementation for createComment
}

export const likeFile: LikeFile<{ fileId: string }, void> = async (
{ fileId },
context
) => {
// Implementation for likeFile
}
3. Make sure you're not using export default anywhere in your operations file. 4. After making these changes, run wasp clean and then wasp start to ensure all the generated code is updated. This approach ensures that you're using named exports consistently, which should resolve the "missing default export" error. It aligns with the examples provided in the Wasp documentation on implementing actions (https://wasp-lang.dev/docs/data-model/operations/actions#example-1). If you're still encountering issues after making these changes, it might be helpful to double-check that all your import statements in both the .wasp file and your TypeScript files are correct and consistent. Also, ensure that the file paths in your import statements are accurate. If the problem persists, you might want to consider sharing more details about your project structure and the exact error message you're seeing in the Wasp Discord community (https://discord.com/channels/686873244791210014/1213883204889612400) for more specific assistance. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ---------------------- Sorry @ApexFossa45, I seem to be having a bit of trouble. Don't worry though, I've pinged my support and they will try to fix me up! :technologist: Perhaps try again in 15mins?
martinsos
martinsos2mo ago
@Filip check this out!
ApexFossa45
ApexFossa45OP2mo ago
Hi, no longer an issue, this has been resolved, thanks! I used named imports and exports as kapa.ai mentioned above and it worked!
Filip
Filip2mo ago
Yeah @ApexFossa45, that was it. Thanks for the patience! We need better error messages for this. Btw, I recommend you always used named imports and exports for your code, regardless of whether you're in wasp or not. Reasoning here: https://github.com/wasp-lang/wasp/issues/546
GitHub
Syntax considerations: Default and named exports · Issue #546 · was...
JavaScript generally offers two approaches to importing and exporting names across modules. The first option is using named exports/imports: // foo.js export function foo() { // ... } // main.js im...
ApexFossa45
ApexFossa45OP2mo ago
Got it, thank you! that makes sense. I'll consider it moving forward on only using named exports. The main reason I was using default for that was chatgpt gave me the defaults. But overall I'd prefer that method, thanks!
Want results from more Discord servers?
Add your server