Javascript Typescript-TypeError myclass.myFunction不是函数

Javascript Typescript-TypeError myclass.myFunction不是函数,javascript,function,typescript,undefined,Javascript,Function,Typescript,Undefined,我面临以下代码的问题 它基本上应该做什么。它应该加载并解析给定的JSON文件。在RequestListender中,它应该显示ID和字符串Hello,该字符串由Product.ts中的ToString()方法返回。如果正确显示了tProduct.Id,则tProduct.ToString()方法将失败,错误如下所述 先谢谢你 错误消息: 文件:Test.ts 文件Product.ts HTML部分: tsconfig.json(我不确定它是否相关): 我不熟悉TypeScript,但看看编译后的

我面临以下代码的问题

它基本上应该做什么。它应该加载并解析给定的JSON文件。在RequestListender中,它应该显示
ID
和字符串
Hello
,该字符串由Product.ts中的
ToString()
方法返回。如果正确显示了
tProduct.Id
,则
tProduct.ToString()
方法将失败,错误如下所述

先谢谢你

错误消息:

文件:Test.ts

文件Product.ts

HTML部分:

tsconfig.json(我不确定它是否相关):


我不熟悉TypeScript,但看看编译后的JavaScript,我注意到tProduct只是一个POJO,而不是Product类的实例(即,
tProduct instanceof Product==false

Id不出错的原因是因为JSON.parse返回一个具有Id属性的对象

要查看如何反序列化为TypeScript类型,可以检查以下答案:

行:

var tProduct : pvis.Product = JSON.parse(this.responseText);
这是错误的。它编译的原因只是因为
JSON.parse
返回
any

要使用类
产品
,您必须以某种方式创建它的实例。JSON解析不会这样做,它只会返回一个包含已解析JSON的对象,它不会是
pvis.Product
类的实例

如果您要做的是键入JSON结果,那么可以使用接口来完成。例如,如果表单上有一个JSON对象:

{
    id: "some value",
    name: "some name",
    count: 4
}
您可以使用以下界面键入:

interface myInterface {
    id: string;
    name: string;
    count: number;
}
并像这样使用它:

var myParsedAndTypedJson: myInterface = JSON.parse("....");
然而,像这样创建的对象永远不会有方法,如果您想要该功能,您必须将该信息传递给一个类,该类可以以某种方式使用它,例如

class myClass implements myInterface {

    get id(): string { return this.initData.id; }
    get name(): string { return this.initData.name; }
    get count(): number { return this.initData.count; }

    constructor(private initData: myInterface) {

    }

    public ToString() {
        return this.id + ' ' + this.name + ' ' + this.count;
    }
}
可以找到这方面的工作示例


您可能希望了解如何使用typescript接口和JSON,以进一步了解其工作原理

我出现了这个错误,这是由于我的文件中的循环依赖关系造成的

import { foo } from "./fileB.ts"

export function bar() { ... }

foo();

这将产生:


TypeError:fileA_1.foo不是一个函数

您可以使用接口的方法创建一个类

interface IMyInterface() {
}

class MyInterfaceMethods () {
     static MyMethod(IMyInterface data) {
    
     }
}


可能还有另一种解决方案-混合。

接口方法是我的第一个选择。就像你贴的一样。我刚把它从样本中删除,以缩短它的长度。对不起。。。我对这里很陌生(点击回车键),所以这里有一个完整的答案:界面方法是我的第一个选择。就像你贴的一样。我刚刚从示例中删除了它以使其更短,因为接口不是问题的一部分。正如您和@Dustin Hodges所说,问题在于JSON.parse,它不会创建实例。我是这么想的。谢谢你们的支持,给了我正确的方向。没问题,我更新了我的答案来修复代码中的一些错误,并提供了一个运行示例。很乐意帮忙!谢谢现在我让它工作了。我只需要做一点小小的修改:行
var myParsedAndTypedJson:myInterface=JSON.parse(“…”)应该是(那么它工作得很好):
var myParsedAndTypedJson:myInterface=newmyclass(JSON.parse(“…”)谢谢!这帮助我意识到我的用户对象没有作为其类的实例传入。它是作为User类型的普通JS对象传入的。这就是为什么它缺少真实用户对象的所有方法。。。伙计,打字本有点烂,哈哈。
{
    id: "some value",
    name: "some name",
    count: 4
}
interface myInterface {
    id: string;
    name: string;
    count: number;
}
var myParsedAndTypedJson: myInterface = JSON.parse("....");
class myClass implements myInterface {

    get id(): string { return this.initData.id; }
    get name(): string { return this.initData.name; }
    get count(): number { return this.initData.count; }

    constructor(private initData: myInterface) {

    }

    public ToString() {
        return this.id + ' ' + this.name + ' ' + this.count;
    }
}
import { foo } from "./fileB.ts"

export function bar() { ... }

foo();
import { bar } from "./fileA.ts"

export function foo() { ... }

bar();
interface IMyInterface() {
}

class MyInterfaceMethods () {
     static MyMethod(IMyInterface data) {
    
     }
}