gpt4 book ai didi

angular - Class Casting 如何在 Typescript 中工作

转载 作者:太空狗 更新时间:2023-10-29 17:46:06 26 4
gpt4 key购买 nike

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

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

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

constructor(){}

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


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

testData.sayHello(); <-- undefined

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

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

最佳答案

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

所以这段代码:

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

关于angular - Class Casting 如何在 Typescript 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51479979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com