Skip to content

Generic vue types break depending how props are accessed in template. #3714

Closed
@minht11

Description

@minht11

Generic vue types break depending how props are accessed in template.
Lets take component like this, it all works fine:

<script lang="ts">
export const customFormatter = (num: number) => `${num * 3}!!!`
export type FormatNumber<T> = (num: T) => string;
</script>

<script lang="ts" setup generic="T extends number, Formatter extends FormatNumber<T>">
const props = defineProps<{
	value: T,
	formatter: Formatter
}>()
</script>

<template>
	{{ value }} {{ props.formatter(props.value) }}
</template>

Now take the same component and instead use prop directy inside template without props. like this:

<script lang="ts">
export const customFormatter = (num: number) => `${num * 3}!!!`
export type FormatNumber<T> = (num: T) => string;
</script>

<script lang="ts" setup generic="T extends number, Formatter extends FormatNumber<T>">
defineProps<{
	value: T,
	formatter: Formatter
}>()
</script>

<template>
	{{ value }} {{ formatter(value) }}
</template>

And you will get This expression is not callable. Type 'unknown' has no call signatures.
Screenshot 2023-11-07 at 00 54 05

Metadata

Metadata

Assignees

No one assigned

    Labels

    good reproduction ✨This issue provides a good reproduction, we will be able to investigate it firstupstream

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions