babel-plugin-jsx icon indicating copy to clipboard operation
babel-plugin-jsx copied to clipboard

[Question] In the future and Object slot typing be supported by this plugin

Open louiss0 opened this issue 1 year ago • 11 comments

🧐 Problem Description

In Vue you are able to inject slots by using this syntax

<HelloWorld>
      { {
          default(props:Record<string, unknown>) {
          
            return props? props.value : "No props"

          }
        }
      }
 </HelloWorld>

But when I give types for slots I get no error regarding whether or not I'm typing the wrong one or not.


type Slots = SlotsType< { default(props: Record<string, unknown>): JSX.Element }>
export default defineComponent((props: { msg: string, value: number, }, ctx: SetupContext<null, Slots>) => {

 return <> {ctx.slots.default() } </>

}

🚑 Other information

Here is a repo You can use to get what I mean. Vue JSX Example

louiss0 avatar Jun 28 '23 02:06 louiss0

@louiss0, it is much easier to use v-slots directive, if you want strong typing.

Examples: https://github.com/funny-family/vue3-ts-playground/blob/master/src/app/components/not-found/not-found.component.tsx#L210 https://github.com/funny-family/vue3-ts-playground/blob/master/src/app/shared/components/text-field/text-field.render.tsx

funny-family avatar Jul 07 '23 04:07 funny-family

@louiss0, it is much easier to use v-slots directive, if you want strong typing.

Examples: https://github.com/funny-family/vue3-ts-playground/blob/master/src/app/components/not-found/not-found.component.tsx#L210 https://github.com/funny-family/vue3-ts-playground/blob/master/src/app/shared/components/text-field/text-field.render.tsx

You can use this Stackblits example repo to show me what you mean. Stack Blits Setup for you

louiss0 avatar Jul 07 '23 16:07 louiss0

https://github.com/vue-macros/vue-macros/pull/720 vue-macros support the type hint for v-slots

zhiyuanzmj avatar Jul 04 '24 08:07 zhiyuanzmj

vue-macros/vue-macros#720 vue-macros support the type hint for v-slots

I need to write an object as the child not use a directive.

<HelloWorld>
      { 
          default(props:Record<string, unknown>) {
          
            return props? props.value : "No props"

          }
        }
      
 </HelloWorld>

louiss0 avatar Jul 04 '24 13:07 louiss0

Because of the child maybe a variable to display string.

const foo = 'hello world'
<HelloWorld>
      { foo }
 </HelloWorld>

zhiyuanzmj avatar Jul 04 '24 13:07 zhiyuanzmj

Because of the child maybe a variable to display string.

const foo = 'hello world'
<HelloWorld>
      { foo }
 </HelloWorld>

Can the plugin be rewritten so that JSX works like React or Solid? I should be able to use an object as a child or the template tag to define slots like in SFC. If I specify types in the function I should be forced to type an object as a child.

louiss0 avatar Jul 04 '24 15:07 louiss0

Vue Macros have a v-slot directive to define slot just like in vue template, also has type hint. https://vue-macros.dev/features/jsx-directive.html#v-slot

zhiyuanzmj avatar Jul 05 '24 00:07 zhiyuanzmj

Maybe I should add type hints only if the expression is written as an object.

zhiyuanzmj avatar Jul 05 '24 00:07 zhiyuanzmj

Maybe I should add type hints only if the expression is written as an object.

The plugin needs to be rewritten to support objects as child without using an expression.

louiss0 avatar Jul 05 '24 01:07 louiss0

https://github.com/vue-macros/vue-macros/pull/722

zhiyuanzmj avatar Jul 05 '24 02:07 zhiyuanzmj

@vue-macros/[email protected] is released.

zhiyuanzmj avatar Jul 07 '24 12:07 zhiyuanzmj