Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

138
Visualizações
obtener tipo genérico en TypeScript

Necesito una función para devolver algunos de los valores "predeterminados" para un tipo. Digamos, quiero -1 para números enteros, "ninguno" para cadenas, MyEnum.DefaultValue para una enumeración...

Empecé con el siguiente problema para implementar una función genérica para el siguiente código: ingrese la descripción de la imagen aquí

( .value es del tipo 'cadena' que trato de convertir en cadenas, números o booleanos)

 public getPropertyValue<Type>(propertyCode: string, properties: PropertyValue[]): Type { return <Type>(properties.find(x => x.propertyCode === propertyCode)?.value || defaultValue); } public async calculate(properties: PropertyValue[]): Promise<CalculatorResult[]> { const STA = <EnumSTA>(properties.find(x => x.propertyCode === 'STA')?.value || EnumSTA.NF_EN_1992_1_1_NA); const FYK = <number>(properties.find(x => x.propertyCode === 'FYK')?.value || 0); const CON = <EnumCON>(properties.find(x => x.propertyCode === 'CON')?.value || EnumCON.C3037); const BCO = <number>(properties.find(x => x.propertyCode === 'BCO')?.value || 0); const HCC = <string>(properties.find(x => x.propertyCode === 'HCC')?.value || 'none'); const GTC = <number>(properties.find(x => x.propertyCode === 'GTC')?.value || 0);

Quiero escribir una función genérica que me devuelva el valor de tipo predeterminado, como esta

Algunos pseudo código a continuación:

 public getDefaultValue<Type>(): Type { switch(typeof (Type)){ case 'boolean': return false; case 'number': return -1; case 'string': return "none"; case 'EnumCity': return EnumCity.Paris; } }

¿Qué variante real más cercana de esa función es posible con Type/Java/Script?

PD.

Supongamos que tengo la lista completa de tipos posibles, por lo que podría crear algo como esto, que compila bien en TypeScript:

 getPropertyValue<Type extends (string | number | boolean | EnumCity)>() { return <Type>(properties.find(x => x.propertyCode === propertyCode)?.value); }
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

TypeScript se transpila a JavaScript, y JavaScript no conocerá la T en getPropertyValue<T> , ya que todas las anotaciones de tipo se borran de su código TS cuando se transpila a JS.

Le sugiero que vuelva a escribir su getPropertyValue para aceptar otro parámetro que se usará como valor predeterminado cuando sea necesario. Al igual que la convención getOrDefault de Java o unwrap_or de Rust.

 public getPropertyValueOrDefault<ValueType, DefaultType = ValueType>( propertyCode: string, properties: PropertyValue[], defaultValue: DefaultType ): ValueType | DefaultType { return ( properties.find( x => x.propertyCode === propertyCode )?.value as ValueType ?? defaultValue ); }

Tenga en cuenta que property.value as ValueType es una pistola . Si entendí su pregunta correctamente, property.value es en realidad siempre una string . Entonces, la única opción segura de tipo es tener diferentes funciones de obtención para diferentes tipos:

 public getBooleanPropertyOrDefault( propertyCode: string, properties: PropertyValue[], defaultValue: boolean ): Boolean { const value = properties.find(x => x.propertyCode === propertyCode); return typeof value === "undefined" ? defaultValue : Boolean(value); } public getNumberPropertyOrDefault( propertyCode: string, properties: PropertyValue[], defaultValue: number ): Number { const value = properties.find(x => x.propertyCode === propertyCode).value; return typeof value === "undefined" ? defaultValue : Number(value); } // And so on

O incluso algo como mi solución preferida para evitar la carga cognitiva con nombres de función largos:

 public getProp(code: string, props: PropertyValue[]) { const value = props.find(x => x.propertyCode === propertyCode).value; return { or: <T extends string | number | boolean>(dflt: T): T => { if (typeof value === "undefined") return dflt; switch(typeof dflt) { case "string": return String(value); case "number": return Number(value); case "boolean": return Boolean(value); } }, asBoolOr: (dflt: boolean) => Boolean(value ?? dflt), asNumberOr: (dflt: number) => Number(value ?? dflt), asStringOr: (dflt: string) => String(value ?? dflt), parseOr: <T>(parser: (value: string) => T, dflt: T) => typeof value !== "undefined" ? parser(value) : dflt, }; }

que luego usarías como

 const STA = getProp("STA", properties) .parseOr(/* parseSta */, EnumSTA.NF_EN_1992_1_1_NA); const FYK = getProp("FYK", properties).or(0);
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda