首页 > 其他分享 >Vue3 typescript script setup获取范型组件的ref

Vue3 typescript script setup获取范型组件的ref

时间:2023-10-20 18:13:00浏览次数:40  
标签:范型 __ typescript script ctx 获取 ... 类型 ref

原博客地址: https://juejin.cn/post/7247433208437850169?from=search-suggest

在typescript下,如果想获取带类型的组件模板引用,官方文档中说明了方式: https://cn.vuejs.org/guide/typescript/composition-api.html#typing-component-template-refs

const modal = ref<InstanceType<typeof MyModal> | null>(null)

但如果这个MyModal是一个范型组件:

<script setup lang="ts" generic="T extends string | number, U extends Item">

上面获取ref的方法就会报错Type '<T extends XXX | XXX | XXX>(__VLS_props: { ...; } & ... 2 more ... & ComponentCustomProps, __VLS_ctx?: Pick<...> | undefined, __VLS_setup?: Promise<...>) => VNode<...> & { ...; }' does not satisfy the constraint 'abstract new (...args: any) => any'.

那么这种情况下该如何获取这个ref?开头的博客给出了答案:

  1. 在项目中定义一个type-function.d.ts
type GenericComponentExports<D extends (...p: any[]) => any> = import('vue').ComponentPublicInstance &
  Parameters<NonNullable<NonNullable<ReturnType<D>['__ctx']>['expose']>>[0];
  1. 在需要获取组件ref的地方使用GenericComponentExports
const dialogRef = ref<GenericComponentExports<typeof TestComponent>>();

下面解释一下代码
type GenericComponentExports<D extends (...p: any[]) => any> 声明一个范型类型,它接受一个范型参数D。D是一个函数类型,可以接受任意数量的参数(...p: any[]),并且返回任意类型。实际上,D代表了组件的构造函数

import('vue').ComponentPublicInstance:这部分导入了 Vue.js 的 ComponentPublicInstance 类型,它代表了 Vue 3 组件的公共实例。

ReturnType<D>用来获取函数类型D的返回类型

ReturnType<D>['__ctx']:获取返回类型的 __ctx 属性

NonNullable<ReturnType<D>['__ctx']>: 移除了可能为 null 或 undefined 的类型

Parameters<NonNullable<NonNullable<ReturnType<D>['__ctx']>['expose']>>[0]: 最后,Parameters 是一个工具类型,它用于获取函数类型的参数类型,而 [0] 则表示获取参数类型数组的第一个元素

标签:范型,__,typescript,script,ctx,获取,...,类型,ref
From: https://www.cnblogs.com/maurrinho/p/17777662.html

相关文章

  • javascript: 合并数组
     <!doctypehtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no"><metahttp-eq......
  • 2D物理引擎 Box2D for javascript Games 第五章 碰撞处理
    2D物理引擎Box2DforjavascriptGames第五章碰撞处理碰撞处理考虑到Box2D世界和在世界中移动的刚体之间迟早会发生碰撞。而物理游戏的大多数功能则依赖于碰撞。在愤怒的小鸟中,小鸟摧毁小猪的城堡时,便是依赖碰撞而实现的;在图腾破坏者中,当神像坠落到图腾上或摔碎在地面上......
  • javascript 数组对象根据id去重的几种方法
    例如:想去除重复id为1的项arr=[{id:1,name:'张三',age:20},{id:1,name:'张三',age:20},{id:2,name:'李四',age:20},{id:3,name:'马五',age:20},];方法一通过forEach再通过some方法判断数组是否包含当前对象id,不包含则添加so......
  • 问题(小程序):Uncaught (in promise) thirdScriptError {"errMsg":"redirectTo:fail can
    这个是跳转出现了问题,点击之后跳转不过去。解决办法:换一种跳转方式。方式一:wx.redirectTo:关闭当前所在页面,再跳转到指定的非TabBar页面。不受页面层数限制。方式二:wx.navigateTo:不关闭当前所在页面,跳转到指定的非TabBar页面,注意页面路径限制是五层。方式三:wx.switchTab:只可以......
  • JS加密:JavaScript代码加密混淆
    JS加密,即JavaScript代码加密混淆,是指对js代码进行数据加密、逻辑混淆。使js代码不能被分析、复制、盗用,以达到保护js代码、保护js产品、保护js知识产权的目的。JS加密定义JS加密,即:JavaScript代码加密混淆、JavaScript代码混淆加密。JavaScript,简称JS,加密指对JS代码进行密文化处理......
  • NodeJS之父Ryan Dahl:我不想被认为是一个JavaScript专家
    NodeJS之父RyanDahl:我不想被认为是一个JavaScript专家    被称为Node之父的RyanDahl在2012年离开了Node项目,后来加入Google的Brain团队,从事深度学习方面的研究,主要专注在图像的着色和超解像技术上。拥有深厚数学功底的Ryan经历了从Web开发到深度学习的跨越,还主导了......
  • JavaScript内置对象和DOM
    数组数组遍历/* 数组遍历的方法 1.for循环遍历数组下标输出 2.forEach遍历forEach(function(item,index,arr)) 3.filter(function(item,index,arr))返回一个新数组,回调函数返回true的结果会保存在新数组中 4.map(function(item,index,arr)) 返回一个新数组,回调函数retur......
  • Javascript抓取京东、淘宝商品数据
    随着互联网的发展,越来越多的商品信息被发布在各大电商平台上,如京东、淘宝等。这些平台上的商品信息对于消费者来说是非常重要的,可以帮助他们了解商品的价格、详情和评价等信息。而对于商家来说,了解竞争对手的商品信息也是至关重要的。因此,抓取京东、淘宝商品数据成为了一种常见的需......
  • Typescript的数组类型
    TypeScript数组类型暖A暖关注IP属地:湖南2021.03.0416:08:45字数2,138阅读1,166和 JavaScript 语言一样,TypeScript 中也有数组类型。数组指的是有序的元素序列,例如 [1,2,3] 这样的就是一个数组,1、2、3 就是数组中的元素,中括号[] 内可以由任意数量的元素。......
  • javascript如何写不用转义的字符串代码
    js中的String.raw函数 语法 String.raw`templateStr`;  String.raw(obj,...substitutions); 支持能力有限,如可以支持String.raw`c:\aaa\bbb`       //result:   c:\aaa\bbb 但是String.raw`c:\aaa\bbb\`       //result:  ......