簡體   English   中英

在 TypeScript 中獲取泛型類型

[英]get generic type in TypeScript

我需要一個 function 來返回一個類型的一些“默認”值。 比如說,我想要 -1 表示整數,“none”表示字符串,MyEnum.DefaultValue 表示枚舉......

我從以下問題開始為下面的代碼實現通用 function: 在此處輸入圖像描述

.value是“字符串”類型,我嘗試將其轉換為字符串、數字或布爾值)

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

我想寫一個通用的 function 它將返回我的默認類型值,像這樣

一些偽代碼如下:

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

Type/Java/Script 最接近 function 的真正變體是什么?

PS。

假設我有可能類型的完整列表,那么,我可以創建這樣的東西,在 TypeScript 中編譯得很好:

getPropertyValue<Type extends (string | number | boolean | EnumCity)>()
{
   return <Type>(properties.find(x => x.propertyCode === propertyCode)?.value);
}

TypeScript 被轉譯成 JavaScript,而 JavaScript 將不知道getPropertyValue<T> T的 T,因為當它從你的所有類型注釋轉譯成 JS 代碼時

我建議您重寫您的getPropertyValue以接受另一個參數,該參數將在需要時用作默認值。 很像 Java 的getOrDefault約定或 Rust 的unwrap_or

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

請注意, property.value as ValueTypefootgun 如果我正確理解了您的問題, property.value實際上始終是string 那么唯一的類型安全選項是為不同的類型使用不同的 getter 函數:

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

甚至像我首選的解決方案,以避免使用長 function 名稱的認知負擔:

public getProp(code: string, props: PropertyValue[]) {
    const value = props.find(x => x.propertyCode === propertyCode).value;
    return {
        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,
    };
}

然后您將其用作

const STA = getProp("STA", properties)
    .parseOr(/* parseSta */, EnumSTA.NF_EN_1992_1_1_NA);
const FYK = getProp("FYK", properties).asNumberOr(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM