sunmao-ui icon indicating copy to clipboard operation
sunmao-ui copied to clipboard

使用typebox的default代替exampleProperties

Open minjs1cn opened this issue 2 years ago • 7 comments

What problem does this feature solve?

使用typebox的default代替exampleProperties

原来是这样:

{
  metaData: {
   exampleProperties: {
      value: 'text',
   }
  },
  spec: {
    properties: Type.Object({
      value: Type.String({}),
    }),
  }
}

现在是这样:

{
  spec: {
    properties: Type.Object({
      value: Type.String({
	 default: 'text',
      }),
    }),
  }
}

进一步收敛

minjs1cn avatar Aug 31 '22 06:08 minjs1cn

很不错,我们确实打算这样替换。一开始用exampleProperties是个临时方案,当时不知道typebox有这个用法。

tanbowensg avatar Aug 31 '22 06:08 tanbowensg

我觉得 default value 和 exampleProperties 不一定是可替代关系。

default value 可能用于某些场景下将属性处理为默认值,比如新增数组项、表达式转换为普通值等。

exampleProperties 可能用于新增组件时默认展示该组件的使用示例,可以和属性的默认值是不同的。

MrWindlike avatar Aug 31 '22 06:08 MrWindlike

很不错,我们确实打算这样替换。一开始用exampleProperties是个临时方案,当时不知道typebox有这个用法。

如果你们暂时没有规划的话,可以建个PR一起来贡献代码

minjs1cn avatar Aug 31 '22 07:08 minjs1cn

我觉得 default value 和 exampleProperties 不一定是可替代关系。

default value 可能用于某些场景下将属性处理为默认值,比如新增数组项、表达式转换为普通值等。

exampleProperties 可能用于新增组件时默认展示该组件的使用示例,可以和属性的默认值是不同的。

我理解你的说法,但其实是可以等价的,我这里举个例子:

Type.Object({
  users: Type.Array(
    Type.Object(
      {
         id: Type.String(),
      },
     {
       default: {
         name: 'some one',
       },
     },
    ),
    {
      default: [{ name: 'Li Lei' }, { name: 'Han Mei Mei' }],
    },
  )
});

比如这个,当我解析的时候,我认为 users 的默认值是:

[{ name: 'Li Lei' }, { name: 'Han Mei Mei' }]

当我新增一个用户的时候,默认值是:

{
  name: 'some one',
}

这应该和你说的不矛盾吧

minjs1cn avatar Aug 31 '22 07:08 minjs1cn

@MrWindlike 说的有道理。理论上来说,exampleProperties 和 default value 确实可以不同。exampleProperties 可能会为了展示效果更佳复杂花哨一点,而default value应该是尽量简洁的。

但是我们目前有个函数generateDefaultValueFromSpec,作用就是根据 Typebox 类型生成一个默认值,这个一定程度上起到了defaultValue的作用。但是由于这个函数一般就是用来初始化和校验数据结构类型用的,所以对defaultValue具体值是什么没有要求,比如string类型就给个'',number类型就给个0。反过来说,一个花哨的exampleProperties在这些场景中也不会有什么坏处。所以对于需要简洁的default value场景,我们可以继续用这个函数满足。

而且exampleProperties目前只是针对component的properties的,但是实际上所有用Typebox声明的地方都有这个需求。比如component的 state、trait的property和state,还有method的parameters等等

所以,我觉得把 exampleProperties 还是应该放到 defaultValue 中,但是全面替换这个有一定工作量。

tanbowensg avatar Sep 01 '22 03:09 tanbowensg

default value 的语义应该是程序处理上的默认值?example 就比较灵活一些,可以是希望给用户呈现的功能示例。

比如一个日历组件,有一个 events props 用于描述日历上的事项,程序的处理可能希望 default value 是空数组,保证用户不传入时类型也始终一致;example values 可能希望程序一组事项,用于 demo 这个功能。

Yuyz0112 avatar Sep 01 '22 15:09 Yuyz0112

我整理下来sunmao现在其实有两个问题是需要解决的:

  1. 假如有一个字符串的数组,sunmao现在新增数组元素的时候,只能自动新增一个空字符串,不能新增一个自定义的字符串。这个功能用 default 实现比较合适。
  2. exampleProperties 只支持 component 的 property。但是 trait 的 property 也需要 default Value,state、method和slotProps可能也需要。这么看来,default value 是用到typebox的地方就应该有的,但是exampleProperties可能只有component和trait才需要。

所以结论可能是exampleProperties还是需要保留的,但是default Value也需要加,两者功能不同。

tanbowensg avatar Sep 02 '22 02:09 tanbowensg