mirror of https://github.com/vuejs/core.git
94 lines
2.1 KiB
TypeScript
94 lines
2.1 KiB
TypeScript
|
import { ref, computed, watch, expectType, defineComponent } from './index'
|
||
|
|
||
|
const source = ref('foo')
|
||
|
const source2 = computed(() => source.value)
|
||
|
const source3 = () => 1
|
||
|
|
||
|
// lazy watcher will have consistent types for oldValue.
|
||
|
watch(source, (value, oldValue) => {
|
||
|
expectType<string>(value)
|
||
|
expectType<string>(oldValue)
|
||
|
})
|
||
|
|
||
|
watch([source, source2, source3], (values, oldValues) => {
|
||
|
expectType<[string, string, number]>(values)
|
||
|
expectType<[string, string, number]>(oldValues)
|
||
|
})
|
||
|
|
||
|
// const array
|
||
|
watch([source, source2, source3] as const, (values, oldValues) => {
|
||
|
expectType<Readonly<[string, string, number]>>(values)
|
||
|
expectType<Readonly<[string, string, number]>>(oldValues)
|
||
|
})
|
||
|
|
||
|
// immediate watcher's oldValue will be undefined on first run.
|
||
|
watch(
|
||
|
source,
|
||
|
(value, oldValue) => {
|
||
|
expectType<string>(value)
|
||
|
expectType<string | undefined>(oldValue)
|
||
|
},
|
||
|
{ immediate: true }
|
||
|
)
|
||
|
|
||
|
watch(
|
||
|
[source, source2, source3],
|
||
|
(values, oldValues) => {
|
||
|
expectType<[string, string, number]>(values)
|
||
|
expectType<[string | undefined, string | undefined, number | undefined]>(
|
||
|
oldValues
|
||
|
)
|
||
|
},
|
||
|
{ immediate: true }
|
||
|
)
|
||
|
|
||
|
// const array
|
||
|
watch(
|
||
|
[source, source2, source3] as const,
|
||
|
(values, oldValues) => {
|
||
|
expectType<Readonly<[string, string, number]>>(values)
|
||
|
expectType<
|
||
|
Readonly<[string | undefined, string | undefined, number | undefined]>
|
||
|
>(oldValues)
|
||
|
},
|
||
|
{ immediate: true }
|
||
|
)
|
||
|
|
||
|
// should provide correct ref.value inner type to callbacks
|
||
|
const nestedRefSource = ref({
|
||
|
foo: ref(1)
|
||
|
})
|
||
|
|
||
|
watch(nestedRefSource, (v, ov) => {
|
||
|
expectType<{ foo: number }>(v)
|
||
|
expectType<{ foo: number }>(ov)
|
||
|
})
|
||
|
|
||
|
const someRef = ref({ test: 'test' })
|
||
|
const otherRef = ref({ a: 'b' })
|
||
|
watch([someRef, otherRef], values => {
|
||
|
const value1 = values[0]
|
||
|
// no type error
|
||
|
console.log(value1.test)
|
||
|
|
||
|
const value2 = values[1]
|
||
|
// no type error
|
||
|
console.log(value2.a)
|
||
|
})
|
||
|
|
||
|
// #6135
|
||
|
defineComponent({
|
||
|
data() {
|
||
|
return { a: 1 }
|
||
|
},
|
||
|
created() {
|
||
|
this.$watch(
|
||
|
() => this.a,
|
||
|
(v, ov) => {
|
||
|
expectType<number>(v)
|
||
|
expectType<number>(ov)
|
||
|
}
|
||
|
)
|
||
|
}
|
||
|
})
|