Javascript Typescript-TypeError myclass.myFunction不是函数
我面临以下代码的问题 它基本上应该做什么。它应该加载并解析给定的JSON文件。在RequestListender中,它应该显示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,但看看编译后的
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) {
}
}