[英]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.