其实本来是想写一些遇到的坑,然后发现之前迁移的过程中没跟着写这个文章,导致都忘了,现在光记着这是个比较枯燥的体力活。
对于js文件,迁移还是相对比较简单的,主要是把类型搞清楚,对于api调用,参数的类型uniapp都已经给搞好了,可以看看@dcloudio/types下定义的类型,类型搞不好的可以考虑Parameters<T>以及as,这个可以简单看看src/modules/toast.ts,如果参数数量不定,可以尝试一下泛型,对于这个可以简单看看src/modules/datetime.ts。迁移的过程中还是要首先关注最底层的js文件,例如A.js引用了B.js,那么肯定是要先更改B.js,然后再去处理A.js,要注意的是现在的tsconfig.json配置是严格模式,所以也会要求引入的文件为带类型声明的或者本身就是ts的,当然在d.ts中声明一下declare module A.js也不是不行。迁移的话首先可以将后缀直接改成.ts,然后用eslint的自动修正功能,先修正一个地方是一个地方,然后自己去修改类型,尽量别写any吧,虽然TypeScript又称AnyScript,但是还是尽量搞清楚类型,尤其是抽出model层后,带字段提示去写代码还是挺爽的,另外有一些关于类型的扩充以及全局Mixin等可以参考sfc.d.ts和mixins.ts。
// src/modules/toast.ts
export const toast = (msg: string, time = 2000, icon = "none", mask = true): Promise<void> => {
uni.showToast({
title: msg,
icon: icon as Parameters<typeof uni.showToast>[0]["icon"],
mask: mask,
duration: time,
});
return new Promise(resolve => setTimeout(() => resolve(), time));
};
// src/modules/datetime.ts
export function safeDate(): Date;
export function safeDate(date: Date): Date;
export function safeDate(timestamp: number): Date;
export function safeDate(dateTimeStr: string): Date;
export function safeDate(
year: number,
month: number,
date?: number,
hours?: number,
minutes?: number,
seconds?: number,
ms?: number
): Date;
export function safeDate(
p1?: Date | number | string,
p2?: number,
p3?: number,
p4?: number,
p5?: number,
p6?: number,
p7?: number
): Date | never {
if (p1 === void 0) {
// 无参构建
return new Date();
} else if (p1 instanceof Date || (typeof p1 === "number" && p2 === void 0)) {
// 第一个参数为`Date`或者`Number`且无第二个参数
return new Date(p1);
} else if (typeof p1 === "number" && typeof p2 === "number") {
// 第一和第二个参数都为`Number`
return new Date(p1, p2, p3, p4, p5, p6, p7);
} else if (typeof p1 === "string") {
// 第一个参数为`String`
return new Date(p1.replace(/-/g, "http://www.likecs.com/"));
}
throw new Error("No suitable parameters");
}