type AllowedStrings = 'add' |'subtract';
function processString<
Str extends string,
Allowed extends string
>(str: Str, AllowedStrings: Allowed): Str extends Allowed
? { value: Str; result: number }
: null {
if ((AllowedStrings as string[]).includes(str)) {
let num1 = 5;
let num2 = 3;
if (str === 'add') {
return { value: str, result: num1 + num2 } as { value: Str; result: number };
} else if (str ==='subtract') {
return { value: str, result: num1 - num2 } as { value: Str; result: number };
}
}
return null;
}
类型推导逻辑解释
- 泛型定义:
Str extends string
:定义一个泛型Str
,它是字符串类型的子类型,用于表示传入的字符串参数str
的类型。
Allowed extends string
:定义一个泛型Allowed
,它是字符串类型的子类型,用于表示联合类型AllowedStrings
的类型。
- 条件类型:
Str extends Allowed? { value: Str; result: number } : null
:这是一个条件类型。如果Str
(即传入的str
的类型)是Allowed
(即AllowedStrings
)的子类型,那么函数返回一个对象,该对象包含属性value
(类型为Str
,即传入的字符串本身)和result
(类型为number
,是根据str
计算出的结果)。否则,返回null
。
- 运行时判断:
(AllowedStrings as string[]).includes(str)
:在运行时,通过将联合类型AllowedStrings
转换为字符串数组,并使用includes
方法判断str
是否属于AllowedStrings
。如果属于,则根据str
的值进行相应的计算并返回包含str
和计算结果的对象;如果不属于,则返回null
。