Vue中使用Typescript时无法解析的类型引用

k10s72fa  于 2023-06-24  发布在  Vue.js
关注(0)|答案(1)|浏览(431)

我有一个下拉组件和 prop ,你可以通过一个数组或字符串,它将用于从我的Pinia商店获得一个数组。我试着创建一个类型,它允许两个选项中的任何一个,看起来像这样:

type Union<T, U> = (T & Partial<U>) | (U & Partial<T>)

我在VSCode中这样使用它,没有任何错误:

type PropsStore = { store: string }
type PropsArray = { array: any[] }
type StoreOrArray = Union<PropsArray, PropsStore>
const props = defineProps<StoreOrArray>()

但在页面上Vite显示我这个错误:[plugin:vite:vue] [@vue/compiler-sfc] Unresolvable type reference or unsupported built-in utility type都在同一个页面上,我试过改变类型和类型参数的名称,它对任何其他对象都有效,唯一有效的是像这样替换它:

type StoreOrArray = (PropsStore & Partial<PropsArray>) | (PropsArray & Partial<PropsStore>)

我想这很好,但如果我想重复使用它,这很烦人。
所以我想这肯定是和defineProps有关,但是我不明白为什么我做的方式不起作用。可能有一个很好的解释,但当我用谷歌搜索它时,几乎没有搜索结果,所以如果有一个例如YouTube上的视频,这将是非常有帮助的
其他信息(请询问是否有我没有列出的相关信息):

  • Vue 3.3.4(最新)
  • Nuxt 3.5.3(最新版)
  • 节点18.13.0
  • 使用实验性的defineModel宏,删除它,仍然不工作
ppcbkaq5

ppcbkaq51#

Vue目前不支持泛型类型(vue@3.3.4)
(问题https://github.com/vuejs/core/issues/8482
(有PR https://github.com/vuejs/core/pull/8511
唯一支持的是通过TS入侵

const SupportedBuiltinsSet = new Set([
  'Partial',
  'Required',
  'Readonly',
  'Pick',
  'Omit'
] as const)
// [@vue/compiler-sfc] Unresolvable type reference or unsupported built-in utility type
// /home/projects/vitejs-vite-1sv1xj/src/components/HelloWorld.vue
// 2  |  import { ref } from 'vue'
// 3  |  
// 4  |  type Exactly<T> = T;
//    |                    ^
type Exactly<T> = T;
defineProps<Exactly<{ msg: string }>>()

参见https://github.com/vuejs/core/blob/main/packages/compiler-sfc/src/script/resolveType.ts#L528

相关问题