Javascript Typescript:代码看起来相同,但它是';它产生了一个错误

Javascript Typescript:代码看起来相同,但它是';它产生了一个错误,javascript,typescript,Javascript,Typescript,我有这样一个界面: interface Product { [key: string]: { options?: Record<string, string> } } 上面突出显示的一行表示,状态[sku]。选项可以是未定义的,当然我知道没有未定义,因为我之前正在检查该行 但是,这段代码的功能完全相同,并且可以正常工作 const newState = state ?? {} const slice = newState[sku] ??

我有这样一个界面:

  interface Product {
    [key: string]: {
      options?: Record<string, string>
    }
  }
上面突出显示的一行表示,
状态[sku]。选项可以是未定义的,当然我知道没有未定义,因为我之前正在检查该行

但是,这段代码的功能完全相同,并且可以正常工作

  const newState = state ?? {}
  const slice = newState[sku] ?? {}
  slice.options = slice.options ?? {}
  slice.options[id] = e.target.value

那么,我遗漏了什么呢?

这是打字脚本的局限性。如果创建如下类型:

type T = { [key: string]: string | undefined };
然后尝试:

var sth: T = { prop: "abc" };
sth.prop.slice()
您将得到一个错误,因为
sth
的定义仍然是通用的
T
。它不在乎
sth
的一个道具实际上是
字符串(也就是说,typescript不会约束
sth
的类型)

但当你这样做的时候:

var u = { prop: "abc" };
u.prop.slice()
u
的类型将被限制为

{
  prop: string
}

所以这里没有错误。

@Pablo您自己找到了解决方法。引入一个辅助变量并使用它:
var slice=state[sku]=state[sku]??{}
而不是裸
状态[sku]
{
  prop: string
}