Javascript TypeScript编译成功,但输出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=

我是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时,我会出现以下错误-

/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您可以添加其他编译器选项以提供警告。见阿塔尼克的答案。