Búsqueda de sitios web

Creando una lápida en TypeScript


Tengo algunos valores en TypeScript que solo son necesarios dentro del sistema de tipos. Estoy buscando una manera de anular los valores sin olvidar su tipo. La función bury en el ejemplo a continuación se espera que reemplace el valor en tiempo de ejecución por undefined y lo convierta en una señal de marcador para el tipo enterrado. Sin embargo, mi implementación de ejemplo de Tombstone no es suficiente porque Tombstone<{ id: string }> equivale a void, lo cual equivale a Tombstone<{ id: number }>. ¿Cuál sería una buena manera de distinguir entre valores enterrados? Me gustaría evitar confundir a los desarrolladores y desperdiciar memoria en tiempo de ejecución con valores que solo son necesarios para la verificación de tipos.

type Tombstone<_A> = void
function bury<A>(_value: A): Tombstone<A> {
  return undefined as Tombstone<A>
}

type Item = { id: number }

const correct: Tombstone<Item> = bury({ id: 123 })
const incorrect: Tombstone<Item> = bury({ id: 'abc' })  // <- should not work

type Special = Item & { meta: string }

const correct2: Tombstone<Item> = bury({ id: 123, meta: 'test' })
const correct3: Tombstone<Special> = bury({ id: 123, meta: 'test' })

const incorrect2: Tombstone<Special> = bury({ id: 123 })  // <- should not work

Respuesta #1

Usar una clase con una propiedad privada parece funcionar.

class Tombstone<A> {
  // @ts-ignore _a is used to store the type and is never read
  private readonly _a!: A
}

function bury<A>(_value: A): Tombstone<A> {
  return undefined as unknown as Tombstone<A>
}

type Item = { id: number }

const correct: Tombstone<Item> = bury({ id: 123 })
// @ts-expect-error string is not assignable to number
const incorrect: Tombstone<Item> = bury({ id: 'abc' })

type Special = Item & { meta: string }

const correct2: Tombstone<Item> = bury({ id: 123, meta: 'test' })
const correct3: Tombstone<Special> = bury({ id: 123, meta: 'test' })
// @ts-expect-error missing required property 'meta'
const incorrect2: Tombstone<Special> = bury({ id: 123 })