繁体   English   中英

Class Casting如何在Typescript中工作

[英]How does Class Casting work in Typescript

我有一个关于Casting in Typescript的问题。

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

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

  constructor(){}

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


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

testData.sayHello(); <-- undefined

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

任何人都可以解释这种行为吗? 如何inherit方法呢?

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

所以这段代码:

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

只是告诉编译器对象文字是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 

普通对象和类实例之间存在差异。 让我用Javascript解释一下。

当你写这个:

const x = { id: 0 };

它被翻译成这个:

const x = { id: 0 };

但是当你写这个

class Test { 
  id = 0;

  getId() { 
   return this.id; 
 } 
}
const x = new Test();

它转化为:

function Test() {
  this.id = 0;

  this.getId = () => this.id;
}
const x = new Test();

如您所见,在第一种情况下,没有任何功能。 在第二种情况下,有。

当你在Typescript中写这个:

const x: Test = {id: 1};

这只是开发人员的便利,因为变量不是在Javascript中输入的。 这是你的linter到位并告诉你有错误的地方。

Typescript只是一种语法帮助。 它没有为代码带来新功能。 例如,您的类语法将转换为普通JavaScript。 如果你创建一个像你一样的对象,它只是没有别的对象。 通过使用as Test ,IDE将显示属性并假装强制转换。 但是会发生一个更新的版本,并且没有任何类属性被继承。 它只是IDE支持。 如果您希望testData成为您的类的实例,您必须:

let testData = new Test();
testData.property1 = 'test';

然后你可以使用testData.sayHello()

类型转换只是让转换器认为每个实例都是一个类型。 在任何时候,它都不会为您创建该类的实际实例。

类型转换本质上是危险的,因为您丢失了编译时检查,如果您的实际数据结构不符合您的界面,它可能会在运行时中断。

类型转换有一些有效的用例(例如,你有一个来自远程端点的外部定义良好的JSON,你想要定义它的结构,我经常输入对接口的响应)。

但是,如果您希望在实例上使用实际方法,则必须创建它们。 您必须使用构造函数并传入适当的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM