[Typescript 5.0] const Type Parameters with readonly

https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/#exhaustive-switch-case-completions

 

In the example code:

type HasNames = { names: readonly string[] };
function getNamesExactly<T extends HasNames>(arg: T): T["names"] {
    return arg.names;
}

// Inferred type: string[]
const names = getNamesExactly({ names: ["Alice", "Bob", "Eve"]}) ;

Before TS 5.0, namesis string[]. 

 

 

There was a way to handle in this case as const

// Correctly gets what we wanted:
//    readonly ["Alice", "Bob", "Eve"]
const names2 = getNamesExactly({ names: ["Alice", "Bob", "Eve"]} as const);

with as const, we need to make sure it is {names: readonly string[]} instead of {readonly names: string[]}, the string[] has to ben readonly, in order to infer the string literl type.

 

Typescript 5.0

We can use const in generic type, to acheive the effect as as const

<const T extends HasNames>
type HasNames = { names: readonly string[] }; //readonly here is important
function getNamesExactly<const T extends HasNames>(arg: T): T["names"] {
    return arg.names;
}

// Correctly gets what we wanted:
//    readonly ["Alice", "Bob", "Eve"]
const names = getNamesExactly({ names: ["Alice", "Bob", "Eve"]}) ;

 

const Type parameters has to be used within the function call

Works

declare function fnGood<const T extends readonly string[]>(args: T): void;

// T is readonly ["a", "b", "c"]
fnGood(["a", "b" ,"c"]);

 

Not working

declare function fnGood<const T extends readonly string[]>(args: T): void;

const arr = ["a", "b" ,"c"]
// T is string[]
fnGood(arr);

 

 

---

Another example;

const routes = <const T extends string>(routes: T[]) => {
  const addRedirect = (from: T, to: T) => {}

  return {
    addRedirect
  }
}

const router = routes(["/users", "/posts", "/admin/users"])

router.addRedirect("/admin/users", "wef") // error: Argument of type '"wef"' is not assignable to parameter of type '"/users" | "/posts" | "/admin/users"'.

posted @   Zhentiw  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2021-01-30 [Docker] Integrate a MySQL Docker Container Into an Application
2021-01-30 [Docker] Run MySQL in Docker Container
2021-01-30 [Docker] Use Environment Variables for Docker Containers
2020-01-30 [Algorithm] 88. Merge Sorted Array
2019-01-30 [Angular] Improve Server Communication in Ngrx Effects with NX Data Persistence in Angular
2019-01-30 [Webpack] Detect Unused Code with Webpack and unused-files-webpack-plugin
2019-01-30 [Functional Programming Monad] Combine Stateful Computations Using Composition
点击右上角即可分享
微信分享提示