# 常见问题
# shims-vue.d.ts
有什么用处
declare module "*.vue" {
import Vue from "vue";
export default Vue;
}
2
3
4
由于 TypeScript 默认并不支持 *.vue
后缀的文件,所以在 vue 项目中引入的时候需要创建一个 vue-shim.d.ts
文件,放在项目项目对应使用目录下,例如 src/vue-shim.d.ts
意思是告诉 TypeScript *.vue
后缀的文件可以交给 vue 模块来处理。
而在代码中导入 *.vue
文件的时候,需要写上 .vue
后缀。原因还是因为 TypeScript 默认只识别 *.ts
文件,不识别 *.vue
文件:
import Component from "components/component.vue";
参考:
# 使用 Vue prototype 上的方法
import { Component, Vue } from "vue-property-decorator";
@Component
export default class Home extends Vue {
private mounted() {
this.$loading();
}
}
2
3
4
5
6
7
8
TypeScript 报错:Property '$loading' does not exist ...
解决办法:
添加 TS 类型声明文件 src/global.d.ts
import Vue from "vue";
declare module "vue/types/vue" {
interface Vue {
$loading: any;
}
}
2
3
4
5
6
7
# 使用 Vue 构造函数上的静态方法
import Vue from "vue";
import { Component, Vue } from "vue-property-decorator";
@Component
export default class Home extends Vue {
private mounted() {
console.log(Vue.$customConstant);
}
}
2
3
4
5
6
7
8
9
TypeScript 报错:Property '$customConstant' does not exist ...
解决办法:
添加 TS 类型声明文件 src/global.d.ts
import Vue from "vue";
declare module "vue/types/vue" {
interface VueConstructor {
$customConstant: any;
}
}
2
3
4
5
6
7
参考:
# 自定义 window
全局变量
src/global.d.ts
interface Window {
__oa__: any;
}
2
3
# 使用 Node 全局变量 process.env.*
- 安装 Node 类型文件
npm i -D @types/node
- 修改
tsconfig.json
{
// ...
"types": ["node"]
}
2
3
4
# 项目中引用 *.js
文件
src/views/Home.vue
import { Component, Vue } from "vue-property-decorator";
import Print from "@/utils/print/index.js";
@Component
export default class Home extends Vue {
private handlePrint() {
new Print(this.$refs.print);
}
}
2
3
4
5
6
7
8
9
TypeScript 警告:Could not find a declaration file for module '@/utils/print.js'
解决办法:
- 添加
src/utils/print.d.ts
类型文件
简单起见,这里使用了 any
类型。
declare const Print: any;
export default Print;
2
- 修改
src/utils/print.js
,添加类型引用
/// <reference path="./print.d.ts" />
export default class Print {
// ...
}
2
3
4
5
- 修改引用,去掉
.js
后缀
src/views/Home.vue
import { Component, Vue } from "vue-property-decorator";
import Print from "@/utils/print/index";
@Component
export default class Home extends Vue {
private handlePrint() {
new Print(this.$refs.print);
}
}
2
3
4
5
6
7
8
9
相关阅读:三斜指令
# 使用第三方库
# 有类型文件
这种类型的库允许直接在 TS 项目中使用。
TIP
查看库的 package.json
中有无 typings
或 types
字段。
例如:
# 无类型文件,有对应的 @types/*
包
例如:
在项目中安装依赖
npm i -S @types/*
# 无类型文件,无对应的 @types/*
包
在项目中手动添加类型文件,以 gt-native-wap-bridge-sdk
为例:
src/global.d.ts
declare module "gt-native-wap-bridge-sdk";
# 不要使用 undefined
作为 class property 的初始值
@Component
class MyComp extends Vue {
// Will not be reactive
foo = undefined;
// Will be reactive
bar = null;
data() {
return {
// Will be reactive
baz: undefined,
};
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# vue 单文件组件的编译过程
JS: *.vue
--> vue-loader
--> js (html, css)
--> babel-loader
--> *.js
TS: *.vue
--> vue-loader
--> ts (html, css)
--> ts-loader
--> babel-loader
--> *.js
← 类风格的组件