ts中,N extends Record<string,any>约束后, n.x为什么会提示没有x?

function c<N extends Record<string,any>>(n: N) {
    n.x = 123;
}

环境为ts4.6, 提示n上没有x属性.

补充:
我开始说的提问有问题, 我不是想知道为什么, 我想知道如何解决, 上面的例子是我简化的, 为了方便大家看,

实际的需求: 要通过泛型来获取参数的类型, 然后标注成返回值, 但是代码内部, 我必须要对n上的"x"操作, 这个x实际是个变量, 是个string类型.

阅读 2.8k
2 个回答

因为你只告诉它是满足key是string的记录呀。那么这个对象可以没有key咯。即便有,也未必是x咯,可以是其他的string。

function c<N extends {x: number}>(n: N) {
    n.x = 123;
}

N是Record<string, any>的子类型,既然是子类型,那就可能不存在x,你的N是一个泛型,它可能是任意的Record的子类型,所以可能不存在x,这没问题。如果你的n是任意的对象,那就不要用泛型,直接:

function c(n: Record<string,any>) {
    n.x = 123;
}

这样n就是Record类型,很明确的,这样你附什么属性都可以

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题