[英]get generic type in TypeScript
我需要一個 function 來返回一個類型的一些“默認”值。 比如說,我想要 -1 表示整數,“none”表示字符串,MyEnum.DefaultValue 表示枚舉......
( .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 ValueType
是footgun 。 如果我正確理解了您的問題, 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.