关于泛型

来源:8-3 【 TS 泛型类实现】 泛型类实现+泛型类的好处【为什么一定要用泛型类】

燎丶Trance

2021-12-05

import { reactive } from 'vue'
import { FunctionalComponent } from 'vue'

interface LoginWay {
    component_show: boolean
    icon_component: FunctionalComponent,
    icon_show: boolean
    icon_desc: string
}

export type WayBase = Record<string, Pick<LoginWay, 'icon_component' | 'icon_desc'>>

export type LoginWayRecord = Record<string, LoginWay>

// 登录方式动作
export default class LoginWayAction <T extends WayBase = any>{

    // 记录值
    private _last: string | number = ''

    // 结果对象
    ways: LoginWayRecord = {}

    // 构造函数初始化
    constructor(wayBases: T) {
        // 遍历对象键
        Object.keys(wayBases).forEach((key, index) => {
            // 先断言为交叉类型
            let way = wayBases[key] as LoginWay
            // 依据条件挂载额外属性
            0 === index ? (this._last = key, way['component_show'] = Boolean(true), way['icon_show'] = Boolean(false)) : (way['component_show'] = Boolean(false), way['icon_show'] = Boolean(true))
            // 重赋值
            this.ways[key] = way
        }
        )
        // 转换为响应式对象
        this.ways = reactive<LoginWayRecord>(this.ways)
    }

    // 登录方式切换方法
    public change(active: string | number): void {
        let lastWay = this.ways[this._last]
        let activeWay = this.ways[active]
        // 记录值对应操作组件隐藏, 图标组件显示
        lastWay.component_show = Boolean(false)
        lastWay.icon_show = Boolean(true)
        // 当前值对应操作组件隐藏, 图标组件显示
        activeWay.component_show = Boolean(true)
        activeWay.icon_show = Boolean(false)
        // 更新记录值
        this._last = active
    }
}



// 登录方式数据
const wayObjs = {
  username: { 
    icon_component: UserOutlined,
    icon_desc: '用户',
  },
  mobile: {
    icon_component: MobileOutlined,
    icon_desc: '手机'
  }
}

// 表单动作
const { formRef, formData, formRules, cleanForm, formFinish, formFinishFailed, formSubmit } = formAction()
// 登录方式对象
const wayAction: LoginWayAction = new LoginWayAction(wayObjs)

我补全来,您再帮我看下, 还是不行

写回答

3回答

keviny79

2021-12-07

//img.mukewang.com/szimg/61af1e5e09eafd8312750767.jpg

查看ts版本

0
5
燎丶Trance
回复
keviny79
我重新编译一下就好了。。。
2021-12-12
共5条回复

keviny79

2021-12-07

//img.mukewang.com/szimg/61af1b8209b3f5ea12540768.jpg//img.mukewang.com/szimg/61af1b9c095cdc3512740755.jpg

TS 代码本身没问题, 我把代码放到了 TS 和 Vue文件中都可以正常编译错误,没问题,可能原因之一是 TS版本问题,检查下你的 TS 版本,升级到最新版本, 按照上方截图查看版本【需要 打开 TS 文件和 新建 tsconfig.json文件】

0
0

keviny79

2021-12-06

//img.mukewang.com/szimg/61ae046009055edd12580746.jpg

你提供代码不全,我补全了下,可以, 没问题!

0
1
燎丶Trance
我重新贴了代码 麻烦您再帮我看下,还是约束不了
2021-12-07
共1条回复

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程