TypeScript 在对象展开中,`Partial< Record< number, {}>>`没有错误,

r7s23pms  于 5个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(70)

TypeScript版本: 3.8.3
搜索词: [类型推断], [部分], [记录], [对象展开]
代码

type Point = {
  x: number
  y: number
}

type Space = Partial<Record<number, Point>>

function addPointReducer(point: Point, pointId: number, prevSpace: Space): Space {
  const prevPoint = prevSpace[pointId]

  return {
    ...prevPoint,
    [pointId]: point,
  }
}

预期行为:

应该在 ...prevPoint 上抛出错误,因为 Point 不等于 Space

实际行为:

没有错误。

** playground链接:**https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=17&pc=1#code/C4TwDgpgBACg9gSwHbCgXigbwFBSgDwC4okBXAWwCMIAnXKEYsq27AX221EigGUwAhgGNoGGAJrAEAgDYAeAEoQhcGgBM5zajQA0sRCgB8hztgBmpJEKlwkUAWrXxkwJWtIiaACjAHgxZxQ9XxcASTUmCm1gmggAN35hCGJEkQBKFMERLHoVJABnVDBYuMDUDGL41IgAbRCUcIBdTjxY4FIaOxw8PAA6fsrSvx16PDq-JuJ64BG8Dg4gA
相关问题:

1wnzp6jl

1wnzp6jl1#

@ahejlsberg 我一直关注着这些,但感觉对于我们关于这些位置的计算属性键的政策还不够了解。它们是否会超出范围?如何进行检查?

mnemlml8

mnemlml82#

在SO上,number解释了这个问题,并使用https://stackoverflow.com/questions/63037175/typescript-some-strange-spread-allowed-that-breaks-typings

interface S {
  chats: {
    [ChatId: number]: {
      name: string
      messages: []
    }
  }
}

const s1: S = {
  chats: {
    [1123]: {
      name: 'some',
      messages: [],
    },
  },
}

const s2: S = {
  chats: {
    ...s1,
  },
}

console.log('s2', s2)

进行了扩展。Ts playground中可以正常运行,但在s2 { chats: { chats: { '1123': [Object] } } }中会给出非法结果。

nwwlzxa7

nwwlzxa73#

这很可能与 #27273 高度相关。

相关问题