You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

readonly导致TypeScript类型不兼容求助:Router类型适配方案

解决TypeScript中readonly数组与可变数组类型不兼容问题

当使用as const断言对象时,对象内的数组会被推断为只读元组类型,而你定义的Router类型中middleware是可变的Middleware[],两者因readonly属性不兼容导致类型校验失败。以下是几种可行的解决方式:

解决方案1:移除as const断言

如果不需要让数组保持只读特性,直接去掉as const即可,TypeScript会自动推断数组类型为Middleware[],符合Router的类型要求:

type Middleware = (...args: unknown[]) => unknown;
type Router = { middleware?: Middleware[] };

const router = {
    middleware: [() => null],
} satisfies Router;

解决方案2:修改Router类型为只读数组

如果需要保留as const带来的只读特性,将Router中的middleware类型改为只读数组类型(readonly Middleware[]或ReadonlyArray<Middleware>),这样只读元组就能兼容:

type Middleware = (...args: unknown[]) => unknown;
type Router = { middleware?: readonly Middleware[] }; // 变更为只读数组类型

const router = {
    middleware: [() => null],
} as const satisfies Router;

解决方案3:使用类型断言(慎用)

如果既想保留as const又不想修改Router类型,可以通过类型断言将只读数组转为普通数组,但这种方式会绕过TypeScript的类型检查,可能引发后续操作的潜在问题,仅在必要时使用:

type Middleware = (...args: unknown[]) => unknown;
type Router = { middleware?: Middleware[] };

const router = {
    middleware: [() => null] as Middleware[], // 断言为普通数组
} as const satisfies Router;

内容的提问来源于stack exchange,提问作者Stephan D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:50:20