老师在演示useURLLoader的时候,有如下的代码:
function useURLLoader<T>(url: string) {
const result = ref<T | null>(null);
const loading = ref(true);
const loaded = ref(false);
const error = ref(null);
axios
.get(url)
.then((rawData) => {
loading.value = false;
loaded.value = true;
result.value = rawData.data;
})
.catch((e) => {
loading.value = false;
error.value = e;
});
return {
result,
loading,
error,
loaded,
};
}
我在看课程的时候产生了疑问,由于不清楚ref和reactive的具体实现,我只是这样死记下来: 原始类型用ref,对象的话用reactive.
那么这里令我疑惑,为什么这里的result明明是一个对象,却用了ref来包裹呢?
然后我就改写了一下,虽然能成功,但是还是有问题不懂:
function useURLLoader<T extends Object>(url: string) {
// 问题1
// reactive<T>(param) ref<T>(param)
// 上面这两个式子均表示param是T类型的,对吧?
// 问题2
// 为什么以下注释的写法会报错?
// let result:T = reactive({})
// 使用Object.create(null)却是可以的?
let result:T = reactive(Object.create(null))
const loading = ref(true);
const loaded = ref(false);
const error = ref(null);
axios
.get(url)
.then((rawData) => {
loading.value = false;
loaded.value = true;
// 问题三
// 把鼠标放在rawData上面 显示它的类型为AxiosResponse<any>
// 那么raw.data的类型也是any
// 可是我在之前声明了result要为T类型并且T extends Object
// 这TS总该提示我一下吧?
// 可是这也没提示啊
result = rawData.data
})
.catch((e) => {
loading.value = false;
error.value = e;
});
return {
result,
loading,
error,
loaded,
};
}