如何在Typescript中创建深度只读类型



我试图创建一个类型,将使任何数组/对象深度只读。到目前为止,我创建了这个类型:

type DeepReadonly<G> = G extends Array<infer U> ?
ReadonlyArray<DeepReadonly<U>> :
(G extends object ? Readonly<{[p in keyof G]: DeepReadonly<G[p]>}> : G);

但是当通用类型是any时,我有一个问题。在这种情况下,DeepReadonly成为上述条件类型中包括any在内的所有可能性的联合类型。最后是而不是只读类型。

例如:

let x: DeepReadonly<any> = 1;
x = 2; // no error

是否有一个类型像'any',可以定义为只读的情况下,它的数组/对象?是否有可能实现我想要什么在TypeScript放在首位?

提前感谢!

在您的示例中,可以分配变量,因为您使用了let。使用let将永远是可分配的——这就是它的作用。

let x: ...
// This will never be an error for a valid type value, as "let" by definition means that it is assignable.
x = ...

要使它不能分配给x,你首先必须使用const

也就是说,对于你最初的问题,如果你传递any作为类型参数,你就明显地脱离了类型系统,并允许将任何东西赋值给变量。没有类型定义可以使any变成readonly any,这不是一个很有意义的概念。

export  type ReadonlyDeep<T> = {
readonly [P in keyof T]: ReadonlyDeep<T[P]>;
};

最新更新