繁体   English   中英

TypeScript 编译成功但 output JS 显示错误

[英]TypeScript compiles successfully but output JS shows error

我是 TypeScript 的新手,并通过这个简单的代码段尝试自定义类型声明。

剧本

我有这个脚本:

// app.ts

type Customer = {
  name: String,
  isFrequentVisitor: Boolean,
}

type Order = {
  buyer: Customer,
  itemName: String,
  itemPrice: number,
  isConfirm: Boolean
}

function placeOrder (user: Customer): Order {
  let order: Order
  order.buyer = user
  order.itemName = 'Raspberry Pi'
  order.itemPrice = 1000
  order.isConfirm = true
  return order
}

let person: Customer = {
  name: 'John',
  isFrequentVisitor: false
}

let newOrder: Order = placeOrder(person)

if (newOrder.isConfirm) {
  console.log('The order has been confirmed. Check details below:')
  console.log(newOrder)
} else {
  console.log('The order has not been confirmed yet.')
}

问题

我能够成功运行$ 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

要从编译器获取更多信息,您必须使用tsctsconfig.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.

您需要使用一些默认值初始化变量,或者您可以像下面的代码一样填充值。

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' 我们输入空字符串'' , boolean 我们输入false等等。 之后,您可以对变量执行任何操作。 提供默认值的片段:

type exampleType = {
    exampleBoolean: Boolean,
}

let exampleInstance : exampleType = {
    exampleBoolean: false
}
exampleInstance.exampleBoolean = true //change to some real value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM