我试图创建一个类型,将使任何数组/对象深度只读。到目前为止,我创建了这个类型:
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]>;
};