renderless代码的ts类型标注讨论 #252
Replies: 3 comments 3 replies
-
@kagol 请kagol给点建议 |
Beta Was this translation helpful? Give feedback.
-
TS类型确实还需要完善。 |
Beta Was this translation helpful? Give feedback.
-
@qinwencheng 关于 renderless 函数类型标记,我的思路是这样的: 给 vue.ts 文件中的 renderless 函数补充类型每个组件有一个 vue.ts 文件,里面一般是一个 renderless 函数,我们需要先对这个函数的所有参数、返回值以及函数体里面的 state / api 等进行类型声明。 以 它的代码大致如下(只保留最核心的部分代码): export const renderless = (
// 先给 renderless 函数的所有参数加上类型,这里有三个参数,分别补充对应的类型
props: ISliderProps,
{ computed, onBeforeUnmount, onMounted, reactive, watch, inject }: ISharedRenderlessParamHooks,
{ parent, constants, nextTick, emit, mode }: ISliderRenderlessParamUtils
): ISliderApi => { // 给 renderless 函数的返回值添加类型
// 给 api 添加类型
const api: ISliderApi = {}
// 给 state 添加类型
const state: ISliderState = initState({ reactive, computed, props, api, parent })
Object.assign(api, {
state,
hideTip: hideTip(state),
...
})
...
return api
} 第一个参数是组件的 props,可以通过以下方式获取:
第二个参数是 vue 中抛出来的内容
第三个参数是一些工具函数,具体有哪些工具函数,可以参考文件
需要注意的是每个组件的 constants 可能不一样,所以需要单独定义 constants
renderless 函数的返回值是 api,所以我们需要定义 api 的类型
接着是函数体里面的 state / api(和renderless函数返回值类型一样) 的类型
给 index.ts 中的每个函数补充类型index.ts 中的函数分成内外两个部分:
外层函数参数这部分是固定的,可以写一个
里层的就是一个普通的函数,定义好函数参数和返回值类型即可。 |
Beta Was this translation helpful? Give feedback.
-
背景:最近在尝试解决 issue #225 中的渲染问题时,问题定位到
slider
组件的renderless
部分代码中,但我发现vue.ts
和index.ts
代码里面的函数和变量都是any
类型,对上下文的理解添加了一定的困难。讨论内容:在尝试对里面的代码进行标注的时候,遇到了一个困难,所以想讨论一下是否有什么好的解决手段。具体内容如下截图:
具体代码在
tiny-vue/packages/renderless/src/slider/vue.ts
Line 101 in bad8c0d
可以看到,这里传入的 vue api 都是any类型,所以即使对当前文件里的变量和状态都标记上类型后,也会因为使用
any
类型的函数包裹而导致整个变量都是any类型,如:如上描述,我想知道是否有什么办法可以把这些vue函数进行类型标注呢?
Beta Was this translation helpful? Give feedback.
All reactions