Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用typebox的default代替exampleProperties #584

Open
minjs1cn opened this issue Aug 31, 2022 · 7 comments
Open

使用typebox的default代替exampleProperties #584

minjs1cn opened this issue Aug 31, 2022 · 7 comments

Comments

@minjs1cn
Copy link

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',
      }),
    }),
  }
}

进一步收敛

@tanbowensg
Copy link
Collaborator

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

@MrWindlike
Copy link
Contributor

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

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

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

@minjs1cn
Copy link
Author

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

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

@minjs1cn
Copy link
Author

minjs1cn commented Aug 31, 2022

我觉得 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',
}

这应该和你说的不矛盾吧

@tanbowensg
Copy link
Collaborator

@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 中,但是全面替换这个有一定工作量。

@Yuyz0112
Copy link
Contributor

Yuyz0112 commented Sep 1, 2022

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

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

@tanbowensg
Copy link
Collaborator

tanbowensg commented Sep 2, 2022

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants