【发布时间】:2021-07-17 02:28:06
【问题描述】:
我想实现一个函数,它接受一个具有一些已知属性和一些未知属性的对象,然后返回一个添加了一些额外属性的对象:
function addY({ x, ...props}) {
return {
x,
y: x + 1,
...props,
};
}
我试过这个:
function addY<T extends { x: number }>({ x, ...props }: T): T & { y: number } {
return {
x,
...props,
y: x + 1,
};
}
我得到的错误是:
TS2322:类型'{ x:数字; } & 省略
& { y: number; }' 不是 可分配给类型 'T & { y: number; }'。键入'{ x:数字; } & 省略 & { y: number; }' 不可分配给类型 'T'。 '{ x:数字; } & 省略 & { y: number; }' 可分配给 'T' 类型的约束,但 'T' 可以用不同的实例 约束的子类型 '{ x: number; }'
我假设如果输入对象有一个与数字不兼容的参数y,那么返回对象将是不可能的。所以我试图通过以下方式减轻它:
function addY<T extends { x: number }>({ x, ...props }: T): Omit<T, "y"> & { y: number } {
return {
x,
...props,
y: x + 1,
};
}
这给出了错误:
TS2322:类型'{ x:数字; } & 省略
& { y: number; }' 不是 可分配给类型 'Omit & { y: number; }'。键入'{ x: 数字; } & 省略 & { y: number; }' 不可分配给类型 '省略 '
【问题讨论】:
-
去掉返回类型,看看TypeScript怎么说
-
@RobertoZvjerković 如果没有返回签名,它仅在
y不在props中时才有效。如果是,y的类型将被错误地推断为typeof props.y和number的交集。
标签: typescript types typescript-generics