Typescript restrânge tipul generic al unei variabile const cu tip dedus


fundal :

prin const variable cu tip dedus, mă refer

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

legat

Așadar, încerc să restrâng tipul unei astfel de variabile, iată încercarea mea:

nu funcționează

nu funcționează

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


Narrow(c)

asta funcționează, arată ciudat, dar și-a făcut treaba

loc de joacă

așadar întrebarea mea este:

  1. De ce?
  2. vreo soluție mai simplă?
  3. vreo soluție mai bună?

actualizare: în ceea ce privește TypeScript 5.0, niciuna dintre metode nu mai funcționează, folosește doar cuvântul cheie generic cosnt

Răspuns #1

Acest lucru a fost abordat acum în TypeScript 5.0 odată cu introducerea generics const. Consultați acest pull request și problema relevantă pentru mai multe informații. Cu aceasta, definiția Narrow arată acum astfel

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

const c = 1;

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

Acesta acționează într-un mod similar cu tipul Narrow pe care l-am prezentat în comentarii:

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]> });

Cu excepția faptului că deduce totul ca fiind doar pentru citire, ca și cum ai fi apelat cu adevărat funcția cu

Narrow({ ... } as const)

Poți compara metoda dinainte de 5.0 și genericele constante din 5.0 folosind cele două linkuri către laboratorul de testare de mai jos:

  • Tip pre-5.0

  • 5.0 const generice