Closed 100pah closed 2 years ago
@100pah 提的点不少,我先简单回一下。
关于 [question 8] ,这个不在支持范围。如果是各种 object 去 merge,那自己实现 function merge<T1, T2>(a: T1, b:T2): T1&T2
。无论如何,在 define 时,应该是明确的。
关于 [question 4],这是个选择的问题。在 能推导就推导不能推导就放过 和 推导不出来也非让你声明 之间,框架选择了前者。这个问题,和 @otakustay 讨论过。
其他问题,我觉得很对,也是考虑到和支持的。可能和目前 swan 场景中使用方式不同。具体用法,我写完例子放出来。
这是个选择的问题。在 能推导就推导不能推导就放过 和 推导不出来也非让你声明 之间,框架选择了前者。
这一点我还没有理解:如果返回 any
Edit: 在 vue 中尝试:
当推导不出时,返回的是 any ,但是同时也会提示推导不出,从而这 “推导不出” 是开发者可感知的,这种方式感觉也是可以。但“开发者不可感知地返回 any” 感觉不像是好方式 🤔 (不知我的理解和实验是否正确)
Vue这属于推导出来了的。推导不出来的情况更类似于React的useCallback
的getDerivedStateFromError
的参数
如果放unknown
,就是强制使用者每次都写as Xxx
做类型声明,而用any
则是选择性做类型声明
这里的核心问题是通过类型推导并不是明确地知道“这是个不存在的属性”(不然就直接上never
了),解决的办法应该是再试试能不能优化这个推导,直接改成unknown
对用户的负担太大了
解决的办法应该是再试试能不能优化这个推导
感觉是~
而用any则是选择性做类型声明
就是不知道,开发者,怎么能知道,“这里是 any ,没有推导出来”。
就是不知道,开发者,怎么能知道,“这里是 any ,没有推导出来”。
要我说的话,.
以后自动提示没出来就是any
了哈哈哈
@100pah https://github.com/baidu/san/tree/master/example/todos-ts
花大半天写了个简单的 example proj,并尽可能使用各种不同的方式去写组件。由于 3.11 还没有发布,所以试不了。想体验开发时候的感觉,可以通过如下步骤:
ln -s ../../.. san
好了,下面是对开发时支持的一些考虑的说明:
关于 computed ,这里之前考虑到了。但确实实现的有问题,已经修复。 @100pah 很细心!
组件,有两种声明方式:extends Component 和 defineComponent。
对于 view = f(data) 的组件体系,数据是核心,开发者在声明组件之前,应该把数据定义出来,无论采用什么方式声明组件。然后,开发时就能获得 data 的类型支持(在 get、initData、computed内、set等地方) https://github.com/baidu/san/blob/master/example/todos-ts/src/todo/list.ts#L46 https://github.com/baidu/san/blob/master/example/todos-ts/src/ui/category-picker.ts#L13
当然,如果你实在很懒,连数据都不想定义,也是可以的。这是个理念,不知道有没有不认同的。 https://github.com/baidu/san/blob/master/example/todos-ts/src/todo/form.ts#L49
san 的 d.ts 在 Component 和 defineComponent 的 T 提供了空的默认值,可以让开发者偷懒。当然,偷懒就没法获得 data 相关的支持。 https://github.com/baidu/san/blob/master/types/index.d.ts#L90 https://github.com/baidu/san/blob/master/types/index.d.ts#L552
3.11 已经发布,例子 https://github.com/baidu/san/tree/master/example/todos-ts 也可以直接用了。
看起来暂时没问题,我就先关了。有新的问题再开新 issue 讨论吧
我所基于的版本是: 8764a60f4e2e7b1066345ab9194fb3ce1dcb8a55
测试用例:
如下测试用例中,对于有疑问的地方(即 ts 不满足需求或者报错的地方), 已用
[question n]
标出。 可后续以此作为讨论的引用。