const nativeClick = jest.fn()
const childUpdated = jest.fn()
- class Hello extends Component {
+ class Hello extends Component<{
+ count: number
+ }> {
data() {
return {
count: 0
}
}
- class Child extends Component {
+ class Child extends Component<{}, { foo: number }> {
updated() {
childUpdated()
}
const nativeClick = jest.fn()
const childUpdated = jest.fn()
- class Hello extends Component {
+ class Hello extends Component<{ count: number }> {
data() {
return {
count: 0
}
}
- class Child extends Component {
+ class Child extends Component<{}, { foo: number }> {
static options = {
props: {
foo: Number
const childUpdated = jest.fn()
const grandChildUpdated = jest.fn()
- class Hello extends Component {
+ class Hello extends Component<{ count: number }> {
data() {
return {
count: 0
}
}
- class GrandChild extends Component {
+ class GrandChild extends Component<{}, { foo: number }> {
static options = {
props: {
foo: Number
type Flatten<T> = { [K in keyof T]: T[K] }
-export type RenderFunction<P = Data> = (
+export type RenderFunction<P = {}> = (
props: P,
slots: Slots,
attrs: Data
) => any
export interface ComponentClass extends Flatten<typeof InternalComponent> {
- new <D = Data, P = Data>(): D & P & MountedComponent<D, P>
+ new <D = {}, P = {}>(): D & P & MountedComponent<D, P>
}
-export interface FunctionalComponent<P = Data> extends RenderFunction<P> {
+export interface FunctionalComponent<P = {}> extends RenderFunction<P> {
pure?: boolean
props?: ComponentPropsOptions<P>
inheritAttrs?: boolean
// this interface is merged with the class type
// to represent a mounted component
-export interface MountedComponent<D = Data, P = Data>
- extends InternalComponent {
+export interface MountedComponent<D = {}, P = {}> extends InternalComponent {
$vnode: MountedVNode
$data: D
$props: P
const rawProps = unwrap(props)
for (const key in rawProps) {
if (!nextProps.hasOwnProperty(key)) {
- delete props[key]
+ delete (props as any)[key]
}
}
for (const key in nextProps) {
- props[key] = nextProps[key]
+ ;(props as any)[key] = nextProps[key]
}
if (nextAttrs) {
const attrs = instance.$attrs
import { ChildrenFlags } from '../flags'
import { createComponentVNode, Slots } from '../vdom'
import { Component, ComponentType, ComponentClass } from '../component'
+import { unwrap } from '@vue/observer'
export interface AsyncComponentFactory {
(): Promise<ComponentType>
} else if (this.comp) {
return createComponentVNode(
this.comp,
- props,
+ unwrap(props),
slots,
ChildrenFlags.STABLE_SLOTS
)
const contextStore = observable() as Record<string | symbol, any>
-export class Provide extends Component {
+interface ProviderProps {
+ id: string | symbol
+ value: any
+}
+
+export class Provide extends Component<{}, ProviderProps> {
updateValue() {
- contextStore[this.$props.id] = this.$props.value
+ // TS doesn't allow symbol as index :/
+ // https://github.com/Microsoft/TypeScript/issues/24587
+ contextStore[this.$props.id as string] = this.$props.value
}
created() {
if (__DEV__) {
- if (contextStore.hasOwnProperty(this.$props.id)) {
+ const { id } = this.$props
+ if (contextStore.hasOwnProperty(id)) {
console.warn(
- `A context provider with id ${this.$props.id} already exists.`
+ `A context provider with id ${id.toString()} already exists.`
)
}
this.$watch(
beforeUpdate() {
this.updateValue()
}
- render(props: any, slots: Slots) {
+ render(props: ProviderProps, slots: Slots) {
return slots.default && slots.default()
}
}