我怎么能让Typescript知道,我的函数将克隆一个传递的Readonly保护的参数?

时间:2017-02-14 13:18:05

标签: typescript clone readonly

我想知道如何让Typescript理解, update 可以通过作为第二个参数传递给modifyState的函数进行变异,因为 update 将克隆。

let imageArray = [UIImage]()

for i in 0..<limit {
    imageArray.append(UIImage(named: "image\(i)"))
}

2 个答案:

答案 0 :(得分:0)

您可以从收到的Readonly<T>值的泛型类型参数中推断出泛型类型:

function modifyState<S>(
    prevState: Readonly<S>, // <- this one
    updateFunc: (update: S) => void
): Readonly<S> {
    ...
}

我相信代码是不言自明的。如果您需要同时支持readonly和非只读版本,则可以使用重载签名或联合类型,例如:

prevState: Readonly<S> | S

在这种情况下,TypeScript编译器将首选{/ em> Readonly<S>而不是S(适用时)。

答案 1 :(得分:0)

您可以使用此方法:

type Mutable<T extends { [x: string]: any }, K extends string> = {
    [P in K]: T[P];
}

...
updateFunc: (update: Mutable<S, keyof S>) => void

code in playground

如此处所述:Mapped Types syntax to remove modifiers