Javascript TypeScript编译成功,但输出JS显示错误
我是TypeScript新手,通过这个简单的代码片段尝试自定义类型声明 剧本 我有这个剧本: //app.ts 客户类型={ 名称:String, isFrequentVisitor:布尔, } 类型顺序={ 买方:客户, itemName:String, itemPrice:编号, isConfirm:Boolean } 功能地点订单用户:客户:订单{ 让我们点菜吧:点菜 order.buyer=用户 order.itemName='Raspberry Pi' order.itemPrice=1000 order.isConfirm=true 退货单 } 出租人:客户={ 姓名:'约翰', 访客:错 } 让newOrder:Order=placeOrderperson 如果newOrder.isConfirm{ 控制台。记录“订单已确认。请检查以下详细信息:” console.lognewOrder }否则{ console.log“订单尚未确认。” } 问题 我能够在控制台上成功运行$tsc app.ts,没有任何错误,并且可以看到文件旁边的app.js 但是,运行$node app.js时,我会出现以下错误-Javascript TypeScript编译成功,但输出JS显示错误,javascript,node.js,typescript,Javascript,Node.js,Typescript,我是TypeScript新手,通过这个简单的代码片段尝试自定义类型声明 剧本 我有这个剧本: //app.ts 客户类型={ 名称:String, isFrequentVisitor:布尔, } 类型顺序={ 买方:客户, itemName:String, itemPrice:编号, isConfirm:Boolean } 功能地点订单用户:客户:订单{ 让我们点菜吧:点菜 order.buyer=用户 order.itemName='Raspberry Pi' order.itemPrice=
/tmp/app.js:3
order.buyer = user;
^
TypeError: Cannot set property 'buyer' of undefined
另外,如果可能有用的话,我已经链接了编译后的app.js
我在Golang中使用过自定义类型,它们在类似的上下文中工作得很好
我不确定我错过了什么
另外,这不是使用TypeScript的原因吗?这样我们就可以在运行时错误发生之前捕获错误
我希望有一个初学者友好的回答。多谢各位
规格
使用TypeScript版本3.8.3
使用节点版本14.4.0
您需要使用一些默认值初始化变量,或者您可以像下面的代码一样填充该值
function placeOrder (user: Customer): Order {
let order: Order = {
buyer: user,
itemName: 'Raspberry Pi',
itemPrice: 1000,
isConfirm: true
};
return order
}
或者您也可以执行类型断言
function placeOrder (user: Customer): Order {
let order = {} as Order;
order.buyer = user
order.itemName = 'Raspberry Pi'
order.itemPrice = 1000
order.isConfirm = true
return order
}
提供默认值实际上与我的第一个代码段没有什么不同。只要把它的价值。对于“string”,我们放入空字符串,布尔值放入false,以此类推。在那之后,您可以对变量执行您想要的操作。
用于提供默认值的代码段:
type exampleType = {
exampleBoolean: Boolean,
}
let exampleInstance : exampleType = {
exampleBoolean: false
}
exampleInstance.exampleBoolean = true //change to some real value
您需要使用一些默认值初始化变量,或者您可以像下面的代码一样填充该值
function placeOrder (user: Customer): Order {
let order: Order = {
buyer: user,
itemName: 'Raspberry Pi',
itemPrice: 1000,
isConfirm: true
};
return order
}
或者您也可以执行类型断言
function placeOrder (user: Customer): Order {
let order = {} as Order;
order.buyer = user
order.itemName = 'Raspberry Pi'
order.itemPrice = 1000
order.isConfirm = true
return order
}
提供默认值实际上与我的第一个代码段没有什么不同。只要把它的价值。对于“string”,我们放入空字符串,布尔值放入false,以此类推。在那之后,您可以对变量执行您想要的操作。
用于提供默认值的代码段:
type exampleType = {
exampleBoolean: Boolean,
}
let exampleInstance : exampleType = {
exampleBoolean: false
}
exampleInstance.exampleBoolean = true //change to some real value
要从编译器获得更多信息,必须使用tsc或tsconfig.json文件 tsc-strictNullChecks index.ts 上面带有-strictNullChecks选项的命令应显示如下信息:
index.ts:15:3 - error TS2454: Variable 'order' is used before being assigned.
15 order.buyer = user
~~~~~
index.ts:16:3 - error TS2454: Variable 'order' is used before being assigned.
16 order.itemName = 'Raspberry Pi'
~~~~~
index.ts:17:3 - error TS2454: Variable 'order' is used before being assigned.
17 order.itemPrice = 1000
~~~~~
index.ts:18:3 - error TS2454: Variable 'order' is used before being assigned.
18 order.isConfirm = true
~~~~~
index.ts:19:10 - error TS2454: Variable 'order' is used before being assigned.
19 return order
~~~~~
Found 5 errors.
要从编译器获得更多信息,必须使用tsc或tsconfig.json文件 tsc-strictNullChecks index.ts 上面带有-strictNullChecks选项的命令应显示如下信息:
index.ts:15:3 - error TS2454: Variable 'order' is used before being assigned.
15 order.buyer = user
~~~~~
index.ts:16:3 - error TS2454: Variable 'order' is used before being assigned.
16 order.itemName = 'Raspberry Pi'
~~~~~
index.ts:17:3 - error TS2454: Variable 'order' is used before being assigned.
17 order.itemPrice = 1000
~~~~~
index.ts:18:3 - error TS2454: Variable 'order' is used before being assigned.
18 order.isConfirm = true
~~~~~
index.ts:19:10 - error TS2454: Variable 'order' is used before being assigned.
19 return order
~~~~~
Found 5 errors.
虽然我也想到了这个解决方案,但我仍然想知道为什么TS编译器一开始不标记它,比如说尝试分配给未定义的变量!?非常感谢,它起作用了。请添加一段代码,说明如何添加默认值好吗?@roshnet对于您的订单类型,这会有点困难,因为您的买家也是客户类型。所以你也必须初始化它。但我将为更简单的类型1添加一个代码段,您可以轻松地扩展它以初始化客户变量。@ThomasH您可以添加其他编译器选项以提供警告。看到了artanik的答案。虽然我也想到了这个解决方案,但我仍然想知道为什么TS编译器一开始不标记它,比如说尝试分配给一个未定义的变量!?非常感谢,它起作用了。请添加一段代码,说明如何添加默认值好吗?@roshnet对于您的订单类型,这会有点困难,因为您的买家也是客户类型。所以你也必须初始化它。但我将为更简单的类型1添加一个代码段,您可以轻松地扩展它以初始化客户变量。@ThomasH您可以添加其他编译器选项以提供警告。见阿塔尼克的答案。