Typescript使用推断类型缩小常量变量的泛型类型

noj0wjuj  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(118)

背景:
const variable with inferred type的意思是

const c = 1 // this
const c:1 = 1 // not this
const c = 1 as const // not this

related
所以我试图缩小这种变量的类型,这是我的尝试:

不起作用

不起作用

export const Narrow=<T extends any>(v:T extends never ? T: T extends never ? T : T)=>{
  //
}
const c=1

Narrow(c)

这个很有效,看起来很奇怪,但它确实起作用了
Playground
所以我问题是:
1.为什么?
1.有更简单的解决办法吗
1.有更好的解决办法吗?

jjjwad0x

jjjwad0x1#

现在TypeScript 5.0引入了const泛型,解决了这个问题。有关更多信息,请参阅this pull requestthe relevant issue。有了这个,Narrow的定义现在看起来像

export const Narrow = <const T>(v: T) => {};

const c = 1;

Narrow(c); // inferred as Narrow<1>(v: 1)

这与我在评论中展示的Narrow类型的行为类似:

type Narrow<T> =
    | (T extends infer U ? U : never)
    | Extract<T, number | string | boolean | bigint | symbol | null | undefined | []>
    | ([T] extends [[]] ? [] : { [K in keyof T]: Narrow<T[K]> });

除了它将所有内容都推断为只读,就好像您真的用

Narrow({ ... } as const)

您可以使用下面的两个playground链接比较5.0之前的方法和5.0 const泛型:

  • 5.0前类型
  • 5.0 const泛型

相关问题