Skip to content

Instantly share code, notes, and snippets.

@upupming
Created December 10, 2021 15:37
Show Gist options
  • Save upupming/a8a9136ae83c6ba7fa6bc8470d2e63ac to your computer and use it in GitHub Desktop.
Save upupming/a8a9136ae83c6ba7fa6bc8470d2e63ac to your computer and use it in GitHub Desktop.

参考 element plus,很巧妙地使用动态类型定义,同时使用 ExtractPropTypes 得到静态类型。

packages/components/radio/src/radio.ts:

// buildProps 的实现比较复杂,可以直接拿来使用就行了,就是对类型做了优化,有了静态类型类似 `PropType<string>`
export const radioPropsBase = buildProps({
  size: useSizeProp,
  disabled: Boolean,
  label: {
    type: [String, Number, Boolean],
    default: '',
  },
})
export const radioProps = buildProps({
  ...radioPropsBase,
  modelValue: {
    type: [String, Number, Boolean],
    default: '',
  },
  name: {
    type: String,
    default: '',
  },
  border: Boolean,
} as const)
export type RadioProps = ExtractPropTypes<typeof radioProps>

packages/components/radio/src/radio-button.ts:

import { buildProps } from '@element-plus/utils/props'
import { radioPropsBase } from './radio'
import type { ExtractPropTypes } from 'vue'

export const radioButtonProps = buildProps({
  ...radioPropsBase,
  name: {
    type: String,
    default: '',
  },
} as const)

export type RadioButtonProps = ExtractPropTypes<typeof radioButtonProps>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment