当前位置:   article > 正文

如何使用 vue + typescript 编写页面 (typescript简单语法篇)

vue “never”仅表示类型,但在此处却作为值使用

在使用typescript编写项目之前,需要有一定的js【es6】基础知识。在学习ts的过程中,类比js的差异,做到基本结合。 开发中除去js报错的部分,大部分会受到ts的语义限定。

typescript基本内容

1. 变量申明

变量申明的时候,和js一样但又不一样。一样的是变量申明符号是一样的,不一样的是需要附加类型限定。如果你是一个强类型的语言开发者

  1. // js的声明
  2. var name;
  3. let age;
  4. const eat;
  5. function play(bool){}
  6. 复制代码
  1. // ts的声明
  2. var name:string;
  3. let age:number;
  4. const eat:Function; // Function是类型,而function是用来声明函数变量的,请不要用混
  5. function run(bool:string):void {
  6. /*
  7. 传参和基本一样,需要限定传值类型,
  8. 在函数的参数列表后面需要加上返回值限定
  9. */
  10. }
  11. 复制代码

类型申明时,有一个通用类型 any,这个表示这个变量可以接受任意类型的值,并且语法器也会忽略掉当前参数为null/undefined的情况。建议:除非特殊情况,尽量不要使用any作为参数类型,以便后期修改时,发生不必要的错误。

1.1 其他情况
  1. // 大部分时候,我们会声明成这种情况
  2. // 但是在使用时却发现,不能赋值,push值。
  3. var classes:[];
  4. // 实际上上面的那个等价于
  5. var classes:Array<never>;
  6. // 或者等价于
  7. var classes:never[];
  8. 复制代码

never ts独有的修饰类型,表示当前什么也没有。和undefined/null不同,ts只存在never的申明,不存在never这个值。

  1. // 当使用
  2. var a:never;
  3. var b = a;
  4. // 此时的a会被语法提示,在赋值前使用了a。因此,需要将a先初始化才能使用,但是又没有一种值叫never,因此a是无效的声明类型。
  5. // 那么,我们一定要用呢?
  6. // 借助数组实现
  7. var a:never[] = [];
  8. var b:never = a[0];
  9. // 如果在对象里声明使用never呢?
  10. var a = { b:never /*Error: “never”仅表示类型,但在此处却作为值使用。 */ }
  11. 复制代码

2. class 面向对象的类

  • 单独js写法和ts并无不同,并且不支持多继承
  1. class A { }
  2. class B extends A { }
  3. //子类使用构造函数时,需要有效调用父级构造函数
  4. class Animal {
  5. name:string;
  6. constructor(name:string){
  7. this.name = name;
  8. }
  9. }
  10. class Dog extends Animal {
  11. constructor(name:string){
  12. super(name)
  13. }
  14. }
  15. 复制代码
  • js没有interface,但是在ts下有,支持多实现接口
  1. interface A { }
  2. interface B extends A { }
  3. class C implements A,B { }
  4. 复制代码

interface 可以用来类型限定吗? 答案是可以。对于ts来说,所谓类型限定仅仅就是属性类型和名称相符合,和类型和名称没有太大关系

  1. interface A { name: string; age: number }
  2. interface B { name: string; age: number }
  3. class C { name!: string; age!: number }
  4. var a: A = new C;
  5. var b: B = new C;
  6. var c: C;
  7. // 使用非空类型时,需要先初始化值才可以使用
  8. // 否则就会报错 Error:在赋值前使用了变量“c”。
  9. a = b = c;
  10. 复制代码

3. 申明类型不可变

js支持var重复申明,ts有<条件>的支持重复声明

  1. /* 后续变量声明必须属于同一类型。变量“a”必须属于类型“string”,但此处却为类型“number” */
  2. var a:string;
  3. var a:number;
  4. // 重复声明印证了,类型只和属性相关,和名称无关
  5. interface A { name: string; age: number }
  6. interface B { name: string; age: number }
  7. class C { name!: string; age!: number }
  8. var a: A;
  9. var a: B;
  10. var a: C;
  11. 复制代码

4.!:?:

在我们编写代码的时候,经常会遇到 !: ?:这两个组合符号,它们和 : 有什么不同?

!: 表示一定存在,?:表示可能不存在 这两种在语法上叫赋值断言

因此:

  1. /* : 可以在任何需要的场合使用 */
  2. var a:number;
  3. // 不可以申明变量的时候使用
  4. var a!:number;
  5. var a?:number;
  6. // ?: 不可以字面量赋值时使用
  7. var a = { name?:"Pluto" }
  8. 复制代码

关于赋值断言:通常会在class中看见他们的身影

  1. class a {
  2. sad!: string;
  3. // 肯定断言不能赋初值
  4. sad!: string = 'so sad';
  5. // 但是否定断言,就可以
  6. age?: number = 2;
  7. bg = { age!: 16 }
  8. }
  9. 复制代码

在Vue中最常见的肯定断言就是prop还有store引入了,因为我们确信他们已经存在了

  1. @Component
  2. export default class MyComponent extends Vue {
  3. @Prop({ default : "" }) myName !: string;
  4. @State mystate !: boolean;
  5. }
  6. 复制代码

在Vue中最常见的否定断言就是函数传参和类型定义

  1. interface A {
  2. name:string
  3. /* 赋值时,age不是必选项,因此可以不使用 */
  4. age?:number
  5. }
  6. var a:A = {
  7. name:"16"
  8. }
  9. function getSome(some?:string){
  10. /* 通常函数我们使用 给函数参数赋初始值的形式而不是用这种形式 */
  11. return some||""
  12. }
  13. function getSome(some:string=""){
  14. return some
  15. }
  16. 复制代码

5. 赋初值属性

ts中 class定义的属性如果没有赋初值,编译后是不存在的

  1. class A {
  2. name!:string;
  3. }
  4. new A() .hasOwnProperty("name") // false
  5. 复制代码

更多内容 在线TS编译结果对照

上一章 如何使用 vue + typescript 编写页面 (Vue生命周期函数)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/797234
推荐阅读
相关标签
  

闽ICP备14008679号