vue TypeScript: add Props type to component constructor

pprl5pva  于 4个月前  发布在  TypeScript
关注(0)|答案(9)|浏览(64)

这个特性解决了什么问题?

如果我们可以从组件(ExtendedVue)中推断出Props类型,那将会很有用。例如,我们可以使用它来编写CreateElement的类型安全 Package 器(或者直接改进CreateElement的接口)。

function renderComponent<Props>(
        h: CreateElement,
        component: ExtendedVue<Vue, {}, {}, {}, Props>,
        data: VNodeData & { props: Partial<Props> },
        children?: VNodeChildren): VNode {
  return h(component, data, children);
}

const MyComponent = Vue.extend({
  props: { foo: String },
  render(h) { return h("div", this.foo) };
});

const Parent = Vue.extend({
  render(h) {
    return renderComponent(h, MyComponent, { props: { foo: 0 } }); // error: type of property 'foo' are imcompatible
  }
});

提议的API看起来如何?

现在,ExtendedVue<Vue, {}, {}, {}, { foo: string }>ExtendedVue<Vue, {}, {}, { foo: string }, {}>生成相同的类型。这意味着我们无法从ExtendedVue对象中确定Props的类型。我认为,实现这一点的最简单(也是最合理的)方法是在$props$data中添加类型。

- export type CombinedVueInstance<Instance extends Vue, Data, Methods, Computed, Props> = Instance & Data & Methods & Computed & Props;
+ export type CombinedVueInstance<Instance extends Vue, Data, Methods, Computed, Props> = Instance & Data & Methods & Computed & Props & { $data: Data, $props: Props };
vddsk6oq

vddsk6oq1#

实际上我们可以在这里做得更好。通过将 Vue 更改为通用类型构造函数(带有默认值,因此不会有破坏性变化),我们可以将 Vue.extend 编码为返回具有 $props$data 类型的构造函数。此外,启用了 typed JSX。
但是这会使我们的复杂类型文件变得更加复杂。让我们首先使 Vue2.5 稳定,并等待更多反馈。
如果你喜欢这个想法,请用表情符号投票!
cc @ktsn@yyx990803@octref@kaorun343

jei2mxaa

jei2mxaa2#

Sounds nice.
Above all, it would be very nice if vue supports typed JSX by default.
(I have a small library to add types to component for typed JSX. AAMOF, this issue comes from it.)
BTW, current typing loses the information about each props are required or optional, which is necessary for typed JSX.

t5zmwmid

t5zmwmid3#

当前的类型输入会丢失关于每个属性是必需的还是可选的信息。
我认为我们不能为当前API创建一个类型输入,至少当前TS的类型系统不支持它。
示例

ugmeyewa

ugmeyewa4#

我已经使用了提到的库,我认为第一步我们可以做的事情是在使用TSX与Partial时将所有属性设置为可选的,除非传递一个声明的接口。当TS支持它时,这将是一个增强功能。我认为我们还应该创建一个TS问题,以提高对此要求的认识,并将其与此问题联系起来。

我确实认为我们应该支持带有推断属性的类型化TSX。不幸的是,但最终伟大的Vue API也有许多自定义属性需要转换为TSX,如作用域插槽和事件,我们需要为其提供支持。因此,在我看来,接口仍然需要。然而,在可能的情况下,我们应该尽量减少所需的类型,特别是在重复发生的地方,如属性定义。

e4yzc0pl

e4yzc0pl5#

以下的实现方式怎么样?

(虽然可以工作,但是类型定义会变得更复杂...)

hfsqlsce

hfsqlsce6#

我们可以从props对象中形成所需的属性吗?

wlsrxk51

wlsrxk517#

@blake-newman
在编译时可能无法从props中获取所需的Props。
在上面的示例中,repuiredProps的类型是("foo"|"bar")[]

9cbw7uwe

9cbw7uwe8#

对不起,我忘了那个。

lvjbypge

lvjbypge9#

你好,
这个问题的当前状态是什么?
我正在查看这些非常旧的GFI工单。
我可以尝试帮助,只需要一些关于如何继续的信息。
提前感谢。

相关问题