Comprobar si un valor es válido para un tipo de unión

Suponga que tengo este tipo definido en mi aplicación:

type PiiType = 'name' | 'address' | 'email';

Yo uso este tipo alrededor de la aplicación para imponer algunos tipos fuertes. Podemos obtener información del servidor que aparentemente representa PII, y necesitamos verificar si el tipo de PII es válido o no según esta definición de tipo.

Una solución previa sugerido en este tema sugirió tener una segunda matriz que duplique los valores válidos y que verifique las cadenas con el contenido de esa matriz:

type PiiType = 'name' | 'address' | 'email';

isValidPii(value: string): Boolean {
  const piiTypeValues = ['name', 'address', 'email'];
  return piiTypeValues.indexOf(potentialValue) !== -1;
}

Esto no es deseable para nosotros, ya que requiere definir el tipo dos veces, eliminar una sola fuente de verdad y potencialmente crear errores.

¿Cómo puedo verificar si un valor dado es válido de acuerdo con este tipo de unión, sin duplicar su definición?

Por ejemplo, si hubiera un operador comoisoftype, Podría usarlo así:

'name' isoftype PiiType;      // true
'hamburger' isoftype PiiType; // false
100 isoftype PiiType;         // false

... pero este operador no existe, así que no estoy seguro de lo que deberíamos hacer para verificar si un valor sería válido para este tipo. @instanceof existe pero solo verifica las clases / interfaces, ytypeof solo devuelve el tipo de JavaScript (por ejemplo,string onumber).

Estamos considerando usar enumeraciones en su lugar para representar esta escritura, pero me gustaría comprobar si hay algo que podamos hacer con un tipo nativo primero.

Respuestas a la pregunta(2)

Su respuesta a la pregunta