提问人:miko3k 提问时间:1/11/2023 更新时间:1/11/2023 访问量:44
如何在Typescript中声明克隆方法返回可写副本?
How to declare a clone method returns a writable copy in Typescript?
问:
假设我想声明一个包含克隆方法的接口,该接口返回一个可变克隆,即使 object 是 。this
Readonly
可以在 Typescript 中完成吗?对我来说,这似乎是一个微不足道的案例。
让我们想象一下以下界面。就我们的目的而言,是有问题的“克隆”方法,所以我们的接口是由任何 或 轻松实现的。我之所以使用泛型,是因为我希望我的代码和我的代码在这两种情况下都能正常工作。slice
Array
TypedArray
export interface ArrayLike {
[index: number]: number
length: number
slice(): this
}
但是,它不能按预期工作。以下代码不编译:
function clone<T extends ArrayLike>(array: Readonly<T>): T {
return array.slice()
}
错误消息说:
Type 'ArrayLike' is not assignable to type 'T'.
'ArrayLike' is assignable to the constraint of type 'T',
but 'T' could be instantiated with a different subtype
of constraint 'ArrayLike'.ts(2322)
另一种尝试是这样的:(剧透警告:也不起作用)
export type Writeable<T> = { -readonly [P in keyof T]: T[P] }
export interface AnotherAttemptArrayLike {
[index: number]: number
length: number
slice(): Writeable<this>
}
function anotherAttemptClone<T extends AnotherAttemptArrayLike>(array: Readonly<T>): T {
return array.slice()
}
错误消息显示以下内容:
Type 'Writeable<AnotherAttemptArrayLike>' is not assignable to type 'T'.
'T' could be instantiated with an arbitrary type which could be
unrelated to 'Writeable<AnotherAttemptArrayLike>'.ts(2322)
从某种程度上讲,我不相信这种情况没有干净的 Typescript 解决方案,所以我在这里寻求帮助。干杯。
答: 暂无答案
评论
ArrayLike
slice
ArrayLike
clone
T
ArrayLike
ArrayLike & {foo: string}
ArrayLike
ArrayLike
clone
T
ArrayLike