Typecast如何在Typescript中工作

fab*_*i_k 4 casting typescript angular

我有一个关于Typescript中的强制转换的问题。

我有用例,将一个对象强制转换为具有方法的类的特定类型。之后,当我想调用此方法时,它是未定义的,请比较以下代码段:

export class Test {
  property1: any;
  property2: any;

  constructor(){}

  sayHello(): string {
    return 'hello';
  }
}


testData = {
    property1: '',
    property2: 2
  } as Test;

testData.sayHello(); <-- undefined
Run Code Online (Sandbox Code Playgroud)

我还在stackblitz上的一个有角度的应用程序中准备了一个工作或不工作的示例:https ://stackblitz.com/edit/angular-y3s9r4

有人可以解释这种行为吗?方法又怎么可能inherit呢?

Tit*_*mir 6

在打字稿中,这称为类型断言,而不是强制类型转换。术语不同的原因恰恰是它的行为与其他语言不同,即没有运行时行为。类型断言不会转换值并且不会执行任何运行时检查,它们只会告诉编译器您作为开发人员知道某个值将属于某种类型。如何掌握这些知识与编译器无关。

所以这段代码:

testData = {
    property1: '',
    property2: 2
  } as Test;
Run Code Online (Sandbox Code Playgroud)

只是告诉编译器对象文字是类型的Test。对象文字与您的类具有相同的字段,但没有任何方法(因为没有人将它们放在那里)。

要创建类的实例,必须将new运算符与类构造函数一起使用。如果要传递数据,则可以有一个接受数据并将其分配给当前实例的构造函数:

export class Test {
    property1: any;
    property2: any;

    constructor(data: Partial<Test>) {
        Object.assign(this, data);
    }

    sayHello(): string {
        return 'hello';
    }
}


let testData = new Test({
    property1: '',
    property2: 2
});

testData.sayHello();  //ok 
Run Code Online (Sandbox Code Playgroud)