如何在Typescript中声明克隆方法返回可写副本?

How to declare a clone method returns a writable copy in Typescript?

提问人:miko3k 提问时间:1/11/2023 更新时间:1/11/2023 访问量:44

问:

假设我想声明一个包含克隆方法的接口,该接口返回一个可变克隆,即使 object 是 。thisReadonly

可以在 Typescript 中完成吗?对我来说,这似乎是一个微不足道的案例。

让我们想象一下以下界面。就我们的目的而言,是有问题的“克隆”方法,所以我们的接口是由任何 或 轻松实现的。我之所以使用泛型,是因为我希望我的代码和我的代码在这两种情况下都能正常工作。sliceArrayTypedArray

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 解决方案,所以我在这里寻求帮助。干杯。

打字稿 这个 元编程 克隆

评论

0赞 NirG 1/11/2023
在接口中,函数返回类型 函数返回类型设置为 extends 但可能来自不同的类型,例如 extends 但不是 所以 的返回类型设置为 ,但它实际上返回,这就是你得到这个错误的原因ArrayLikesliceArrayLikecloneTArrayLikeArrayLike & {foo: string}ArrayLikeArrayLikecloneTArrayLike

答: 暂无答案