项目地址:https://github.com/SimonZhang...javascript
基于类的写法加上静态类型检查,简直不能再嗨vue
<script lang="ts"> import Vue from "vue"; import Component from "vue-class-component"; import { State } from "vuex-class"; @Component export default class Shops extends Vue { @State shops: StoreState.shop[]; @State searchVal: string; get shopList(): StoreState.shop[] { const shops = this.shops; const searchVal = this.searchVal; return shops.filter( (el: StoreState.shop) => el.shopName.indexOf(searchVal) > -1 ); } } </script>
支持全部原生JavaScript的语法java
如今不少主流语言都是强类型的,而这点也一直是JavaScript所被人诟病的地方。使用TypeScript以后,将会在代码调试、重构等步骤节省不少时间。node
好比说:函数在返回值的时候可能通过复杂的操做,那咱们若是想要知道这个值的结构就须要去仔细阅读这段代码。那若是有了TypeScript以后,直接就能够看到函数的返回值结构,将会很是的方便
如今的主流编辑器如VSCode
、WebStorm
、Atom
、Sublime
等都对TypeScript有着很是友好的支持,主要体如今智能提示上,很是的方便webpack
强大的编译引擎git
不断更新,提供更加方便友好的Apies6
TypeScript是微软开发的语言,而Google的Angular
使用的就是TypeScript,因此不用担忧会中止维护,至少在近几年内TypeScript都会一门主流开发语言github
截止2017.12.17, TypeScript在全球范围内的npm日均下载量在30w
左右,这个数字将近是vue下载量的10倍,可见TypeScript仍是很是受欢迎的web
官方虽然明确提出对TypeScript的支持,可是并无明确的配置文档,本身在配置的时候仍是须要查阅不少资料以及踩不少坑的(这个过程真的很蓝瘦-_-)vue-router
可是如今能够不用踩这个坑啦,我基于官方的vue-cli
写了一个vue-typescript-cli,能够一键构建TypeScript模板
vue init SimonZhangITer/vue-typescript-template <project-name>
好比
vue init SimonZhangITer/vue-typescript-template my-project
而后配置好的TypeScript模板就下载到./my-project
文件夹了,npm run dev
便可运行
这里记录一下当时的踩坑过程,全部配置已经在vue-typescript-template配置完毕
首先须要安装ts-loader
,这是TypeScript为Webpack提供的编译器,相似于babel-loader
npm i ts-loader -D
接着在Webpack的module.rules
里面添加对ts的支持(我这里的webpack版本是2.x):
{ test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.ts$/, loader: 'ts-loader', options: { appendTsSuffixTo: [/\.vue$/], } }
添加可识别文件后缀对ts的支持,如:
extensions: ['.js', '.vue', '.json', '.ts']
建立tsconfig.json文件,放在根目录下,和package.json
同级
配置内容主要也看我的需求,具体能够去typescript的官网查看,可是有一点须要注意:
在Vue中,你须要引入 strict: true (或者至少 noImplicitThis: true,这是 strict 模式的一部分) 以利用组件方法中 this 的类型检查,不然它会始终被看做 any 类型。
这里列出个人配置,功能在注释中给出
{ "include": [ "src/*", "src/**/*" ], "exclude": [ "node_modules" ], "compilerOptions": { // types option has been previously configured "types": [ // add node as an option "node" ], // typeRoots option has been previously configured "typeRoots": [ // add path to @types "node_modules/@types" ], // 以严格模式解析 "strict": true, // 在.tsx文件里支持JSX "jsx": "preserve", // 使用的JSX工厂函数 "jsxFactory": "h", // 容许从没有设置默认导出的模块中默认导入 "allowSyntheticDefaultImports": true, // 启用装饰器 "experimentalDecorators": true, "strictFunctionTypes": false, // 容许编译javascript文件 "allowJs": true, // 采用的模块系统 "module": "esnext", // 编译输出目标 ES 版本 "target": "es5", // 如何处理模块 "moduleResolution": "node", // 在表达式和声明上有隐含的any类型时报错 "noImplicitAny": true, "lib": [ "dom", "es5", "es6", "es7", "es2015.promise" ], "sourceMap": true, "pretty": true } }
main.js
修改为main.ts
,里面的写法基本不变,可是有一点须要注意:引入Vue文件的时候须要加上.vue
后缀,不然编辑器识别不到
main.ts
TypeScript并不支持Vue文件,因此须要告诉TypeScript*.vue
文件交给vue编辑器来处理。解决方案就是在建立一个vue-shims.d.ts文件,建议放在src目录下再建立一个typings
文件夹,把这个声明文件放进去,如:src/typings/vue-shims.d.ts
,文件内容:
*.d.ts
类型文件不须要手动引入,TypeScript会自动加载
declare module '*.vue' { import Vue from 'vue' export default Vue }
到这里TypeScript在Vue中配置就完成了,能够愉快的撸代码了~
如今Vue官方已经明确提出支持TypeScript,并考虑出一个对应的vue-cli
,在这以前,Vue开发团队已经开发出了一些插件库来支持TypeScript,这里简单和你们介绍一下。
vue-class-component是官方维护的TypeScript装饰器,写法比较扁平化。Vue对其作到完美兼容,若是你在声明组件时更喜欢基于类的 API,这个库必定不要错过
ps:用了这个装饰器以后写方法不须要额外加逗号,贼嗨~~~
import Vue from "vue"; import Component from "vue-class-component"; @Component export default class App extends Vue { name:string = 'Simon Zhang' // computed get MyName():string { return `My name is ${this.name}` } // methods sayHello():void { alert(`Hello ${this.name}`) } mounted() { this.sayHello(); } }
这个代码若是用原生Vue语法来写的话就是这样:
export default { data () { return { name: 'Simon Zhang' } }, mounted () { this.sayHello() }, computed: { MyName() { return `My name is ${this.name}` } }, methods: { sayHello() { alert(`Hello ${this.name}`) }, } }
vuex-class是基于基于vue-class-component
对Vuex提供的装饰器。它的做者同时也是vue-class-component
的主要贡献者,质量仍是有保证的。
import Vue from "vue"; import Component from "vue-class-component"; import { State, Action, Getter } from "vuex-class"; @Component export default class App extends Vue { name:string = 'Simon Zhang' @State login: boolean; @Action initAjax: () => void; @Getter load: boolean; get isLogin(): boolean { return this.login; } mounted() { this.initAjax(); } }
上面的代码就至关于:
export default { data() { return { name: 'Simon Zhang' } }, mounted() { this.initAjax() }, computed: { login() { return this.$store.state.login }, load() { return this.$store.getters.load } }, methods: { initAjax() { this.$store.dispatch('initAjax') } } }
vue-property-decorator 是在 vue-class-component 上加强了更多的结合 Vue 特性的装饰器,新增了这 7 个装饰器
@Emit
@Inject
@Model
@Prop
@Provide
@Watch
@Component
(从 vue-class-component 继承)好比说我想引入vue-lazyload
,虽然已经在本地安装,可是typescript仍是提示找不到模块。缘由是typescript是从node_modules/@types
目录下去找模块声明,有些库并无提供typescript的声明文件,因此就须要本身去添加
解决办法:在src/typings
目前下建一个tools.d.ts
文件,声明这个模块便可
declare module 'vue-awesome-swiper' { export const swiper: any export const swiperSlide: any } declare module 'vue-lazyload'
在TypeScript里面使用不了mapState、mapGetters等方法,只能一个变量一个变量的去引用,这个要麻烦很多。不过使用vuex-class
库以后,写法上也还算简洁美观
export default class modules extends Vue { @State login: boolean; // 对应this.$store.state.login @State headline: StoreState.headline[]; // 对应this.$store.state.headline private swiperOption: Object = { autoplay: true, loop: true, direction: "vertical" }; logoClick(): void { alert("点我干吗"); } }
TypeScript仍是很是值得学习和使用一个语言,仍是有不少优势的
欢迎你们对个人项目提建议,欢迎Star~
项目地址:https://github.com/SimonZhang...
QQ交流群:323743292
# 安装依赖 npm install # 启动项目 npm run dev # 打包项目 npm run build