sunmao-ui
sunmao-ui copied to clipboard
使用typebox的default代替exampleProperties
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',
}),
}),
}
}
进一步收敛
很不错,我们确实打算这样替换。一开始用exampleProperties是个临时方案,当时不知道typebox有这个用法。
我觉得 default value 和 exampleProperties
不一定是可替代关系。
default value 可能用于某些场景下将属性处理为默认值,比如新增数组项、表达式转换为普通值等。
exampleProperties
可能用于新增组件时默认展示该组件的使用示例,可以和属性的默认值是不同的。
很不错,我们确实打算这样替换。一开始用exampleProperties是个临时方案,当时不知道typebox有这个用法。
如果你们暂时没有规划的话,可以建个PR一起来贡献代码
我觉得 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',
}
这应该和你说的不矛盾吧
@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 中,但是全面替换这个有一定工作量。
default value 的语义应该是程序处理上的默认值?example 就比较灵活一些,可以是希望给用户呈现的功能示例。
比如一个日历组件,有一个 events props 用于描述日历上的事项,程序的处理可能希望 default value 是空数组,保证用户不传入时类型也始终一致;example values 可能希望程序一组事项,用于 demo 这个功能。
我整理下来sunmao现在其实有两个问题是需要解决的:
- 假如有一个字符串的数组,sunmao现在新增数组元素的时候,只能自动新增一个空字符串,不能新增一个自定义的字符串。这个功能用 default 实现比较合适。
- exampleProperties 只支持 component 的 property。但是 trait 的 property 也需要 default Value,state、method和slotProps可能也需要。这么看来,default value 是用到typebox的地方就应该有的,但是exampleProperties可能只有component和trait才需要。
所以结论可能是exampleProperties还是需要保留的,但是default Value也需要加,两者功能不同。