Javascript TypeScript运行时错误';未定义';
我有下面的HTML+TypeScript,它试图实例化一个名为Point的简单类。单击超链接时,我对每个try/catch子句都会出现以下错误: 错误:Javascript TypeScript运行时错误';未定义';,javascript,.net,runtime-error,typescript,Javascript,.net,Runtime Error,Typescript,我有下面的HTML+TypeScript,它试图实例化一个名为Point的简单类。单击超链接时,我对每个try/catch子句都会出现以下错误: 错误: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>TypeScript HTML App</title> <script src="app.js"&
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>TypeScript HTML App</title>
<script src="app.js"></script>
<script type="text/javascript">
function Test()
{
try { alert(MyLibrary.Point.Empty.ToString()); }
catch (e) { alert(e.message); }
try { alert(new MyLibrary.Point(10, 20).ToString()); }
catch (e) { alert(e.message); }
try { alert(MyLibrary.Point.FromPoint(new MyLibrary.Point(10, 20)).ToString()); }
catch (e) { alert(e.message); }
}
</script>
</head>
<body>
<a href="javascript:Test();">Click Me</a>
</body>
</html>
module MyLibrary
{
export interface IPoint { X: number; Y: number; ToString(): string; }
export class Point implements MyLibrary.IPoint
{
private _X: number = 0;
private _Y: number = 0;
constructor(x: number, y: number)
{
this._X = x;
this._Y = y;
}
public get X(): number { return (this._X); }
public get Y(): number { return (this._Y); }
public ToString(): string
{
return ("{" + this._X.toString() + "," + this._Y.toString() + "}");
}
public static FromPoint(point: MyLibrary.Point): MyLibrary.Point
{
return (new MyLibrary.Point(point.X, point.Y));
}
private static _Empty: MyLibrary.Point = new MyLibrary.Point(0, 0);
public static get Empty(): MyLibrary.Point { return (MyLibrary.Point._Empty); }
}
}
- 无法读取未定义的属性“Empty”
- 未定义不是一个函数
- 未定义不是一个函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>TypeScript HTML App</title>
<script src="app.js"></script>
<script type="text/javascript">
function Test()
{
try { alert(MyLibrary.Point.Empty.ToString()); }
catch (e) { alert(e.message); }
try { alert(new MyLibrary.Point(10, 20).ToString()); }
catch (e) { alert(e.message); }
try { alert(MyLibrary.Point.FromPoint(new MyLibrary.Point(10, 20)).ToString()); }
catch (e) { alert(e.message); }
}
</script>
</head>
<body>
<a href="javascript:Test();">Click Me</a>
</body>
</html>
module MyLibrary
{
export interface IPoint { X: number; Y: number; ToString(): string; }
export class Point implements MyLibrary.IPoint
{
private _X: number = 0;
private _Y: number = 0;
constructor(x: number, y: number)
{
this._X = x;
this._Y = y;
}
public get X(): number { return (this._X); }
public get Y(): number { return (this._Y); }
public ToString(): string
{
return ("{" + this._X.toString() + "," + this._Y.toString() + "}");
}
public static FromPoint(point: MyLibrary.Point): MyLibrary.Point
{
return (new MyLibrary.Point(point.X, point.Y));
}
private static _Empty: MyLibrary.Point = new MyLibrary.Point(0, 0);
public static get Empty(): MyLibrary.Point { return (MyLibrary.Point._Empty); }
}
}
TypeScript编译得很好,项目的目标是ECMA5。不知道引擎盖下面发生了什么
更新:如果我从类中删除静态属性,代码将开始工作。你知道为什么吗?为静态属性生成的JavaScript如下所示:
Object.defineProperty(Point, "Empty", {
get: function ()
{
return (MyLibrary.Point._Empty);
},
enumerable: true,
configurable: true
});
Point._Empty = new MyLibrary.Point(0, 0);
从错误消息判断,模块MyLibrary是在运行时定义的,但其中的类点不是。我猜JS文件点是在没有被加载
因为您没有使用模块,所以每个包含要使用的类的JS文件都必须在HTML文件的顶部引用。考虑使用<代码> -out文件< /代码>编译选项将所有类编译成单个文件,以便只需要引用一个文件。 从错误消息中判断,模块MyLoin在运行时被定义,但其内部的类点不是。我猜JS文件点是在没有被加载
因为您没有使用模块,所以每个包含要使用的类的JS文件都必须在HTML文件的顶部引用。考虑使用<代码> -out文件< /代码>编译选项将所有类编译成单个文件,以便只需要引用一个文件。 从错误消息中判断,模块MyLoin在运行时被定义,但其内部的类点不是。我猜JS文件点是在没有被加载
因为您没有使用模块,所以每个包含要使用的类的JS文件都必须在HTML文件的顶部引用。考虑使用<代码> -out文件< /代码>编译选项将所有类编译成单个文件,以便只需要引用一个文件。 从错误消息中判断,模块MyLoin在运行时被定义,但其内部的类点不是。我猜JS文件点是在没有被加载
因为您没有使用模块,所以每个包含要使用的类的JS文件都必须在HTML文件的顶部引用。考虑使用<代码> -out文件< /Cord>编译选项将所有类编译成单个文件,以便只需要引用一个文件。 在其静态成员初始化期间,不能引用模块内类的限定名——该名称尚未可用。更改这两行:
private static _Empty: MyLibrary.Point = new MyLibrary.Point(0, 0);
public static get Empty(): MyLibrary.Point { return (MyLibrary.Point._Empty); }
对此
private static _Empty: MyLibrary.Point = new Point(0, 0);
public static get Empty(): MyLibrary.Point { return (Point._Empty); }
如果检查生成的代码,您可以看到属性
MyLibrary.Point
仅在类的静态初始化发生后设置。这可能被认为是一个编译器错误。在初始化模块的静态成员时,您不能在模块内引用类的限定名称,因为该类尚未使用该名称。更改这两行:
private static _Empty: MyLibrary.Point = new MyLibrary.Point(0, 0);
public static get Empty(): MyLibrary.Point { return (MyLibrary.Point._Empty); }
对此
private static _Empty: MyLibrary.Point = new Point(0, 0);
public static get Empty(): MyLibrary.Point { return (Point._Empty); }
如果检查生成的代码,您可以看到属性
MyLibrary.Point
仅在类的静态初始化发生后设置。这可能被认为是一个编译器错误。在初始化模块的静态成员时,您不能在模块内引用类的限定名称,因为该类尚未使用该名称。更改这两行:
private static _Empty: MyLibrary.Point = new MyLibrary.Point(0, 0);
public static get Empty(): MyLibrary.Point { return (MyLibrary.Point._Empty); }
对此
private static _Empty: MyLibrary.Point = new Point(0, 0);
public static get Empty(): MyLibrary.Point { return (Point._Empty); }
如果检查生成的代码,您可以看到属性
MyLibrary.Point
仅在类的静态初始化发生后设置。这可能被认为是一个编译器错误。在初始化模块的静态成员时,您不能在模块内引用类的限定名称,因为该类尚未使用该名称。更改这两行:
private static _Empty: MyLibrary.Point = new MyLibrary.Point(0, 0);
public static get Empty(): MyLibrary.Point { return (MyLibrary.Point._Empty); }
对此
private static _Empty: MyLibrary.Point = new Point(0, 0);
public static get Empty(): MyLibrary.Point { return (Point._Empty); }
如果检查生成的代码,您可以看到属性
MyLibrary.Point
仅在类的静态初始化发生后设置。这可能被认为是一个编译器错误。以下是管理TypeScript项目的各种方法,这样您就不会未定义:@basarat:我没有访问YouTube的权限。这段视频在别处有吗?如果你告诉我标题,我可能会找到它。谢谢。很抱歉听到这个消息,标题是“TypeScript模块去神秘化:内部,AMD与RequireJS,CommonJS与NodeJS”。下面是管理您的TypeScript项目的各种方法,这样您就不会被未定义:@basarat:我没有访问YouTube的权限。这段视频在别处有吗?如果你告诉我标题,我可能会找到它。谢谢。很抱歉听到这个消息,标题是“TypeScript模块去神秘化:内部,AMD与RequireJS,CommonJS与NodeJS”。下面是管理您的TypeScript项目的各种方法,这样您就不会被未定义:@basarat:我没有访问YouTube的权限。这段视频在别处有吗?如果你告诉我标题,我可能会找到它。谢谢。很抱歉听到这个消息,标题是“TypeScript模块去神秘化:内部,AMD与RequireJS,CommonJS与NodeJS”。下面是管理您的TypeScript项目的各种方法,这样您就不会被未定义:@basarat:我没有访问YouTube的权限。这段视频在别处有吗?如果你告诉我标题,我可能会找到它。谢谢。很抱歉听到这个消息,标题是“TypeScript Modules Demystified:Internal,AMD with RequireJS,CommonJS with NodeJS”。谢谢,但我认为情况并非如此,因为我可以在浏览器源代码视图中导航到app.js
文件。奇怪的是,当我从类中删除静态属性Empty
时,代码开始工作。有什么想法吗?请看问题末尾的更新。我已经包含了为静态属性生成的JavaScript,以防它有所帮助