【问题标题】:Typescript method on class undefined类未定义的打字稿方法
【发布时间】:2017-04-12 10:59:39
【问题描述】:

在 Typescript 中,我有一个类 Contact,它实现了一个接口 IContact。 我想向Contact 类添加一个属性或函数,它返回两个其他字段(名字和姓氏)的组合。 IContact 接口的定义如下:

export interface IContact {
    firstname: string;
    lastname: string;
}

Contact 类如下所示:

export class Contact implements IContact {
    constructor(
        public firstname: string,
        public lastname: string
    ) { }

    public fullname(): string {
        return this.firstname + " " + this.lastname;
    }
}

在我看来,我想输出Contact.fullname() 的结果,但我收到一个错误,即fullname 不是函数。 我确实可以访问该类的所有其他属性。

==== 更新 ===

我将添加一些额外的代码来澄清一些内容。 当我在我的视图中输出fullname 属性时,我尝试了contact.fullname(),但也尝试了contact.fullname,但没有任何结果。 在我的组件中,试图弄清楚发生了什么我试图将fullname 输出到控制台,如下所示:console.log("FULLNAME " +contact.fullname());,但这在控制台中给了我以下消息:EXCEPTION _this.contact.fullname is not a function

===== 已更新答案 ========

正如 Sakuto 所说的那样,联系人列表是由从服务器接收到的一些 json 创建的。通过完全调用它的构造函数来创建一个新实例,我能够输出fullname 属性。 谢谢Sakuto!

【问题讨论】:

  • Contact.fullname() .. 你在调用 class.function() 吗?如果是这样,函数需要是静态的..
  • 不,我在 Contact 类的实例上调用函数。
  • 拜托,你能显示你的html吗?
  • 问题是如何创建Contact 对象?见 Sakuto 的回答。

标签: angular typescript


【解决方案1】:

您可能试图在从JSON 动态转换的对象上调用此方法。动态casted object 没有类中定义的方法,它们只是尊重contract 并具有属性。

使当前代码正常工作的唯一方法是创建Contact 的新实例,而不是直接使用<Contact> yourObject 进行转换;

解决方案是这样做:

let contactsList: Contact[] = [];
yourServiceReturn.ForEach(c => contactsList[] = new Contact(c.name, c.surname));
// You can now call getFullName on the object stored on contactsList 

【讨论】:

  • 你是对的,我理解问题但不理解解决方案。这是否意味着Contact 类不应该实现IContact 接口但具有与方法public fullname(): string 相同的属性?然后我可以执行以下操作:var contact = <Contact>contactItemFromCollection;console.log(contact.fullname());
  • 不行,问题是这种行为在语言中没有实现,不能将对象强制转换为类并获取方法,必须手动实例化对象。检查我的答案。
  • 啊,是的!谢谢,做到了。我想我在 C# 模式下有点太多了。
  • @Sakuto - 你是怎么知道的?对于 JSON 加载的 TS 类,我没有找到任何有关此问题的文档..
【解决方案2】:

How do I cast a JSON object to a typescript class

onReceiveCompany( jsonCompany : any ) 
{
   let newCompany = new Company( jsonCompany );

   // call the methods on your newCompany object ...
}

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 2016-11-11
    • 1970-01-01
    • 2021-08-30
    • 2016-11-06
    • 2016-12-13
    • 2016-09-05
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多