我想从其余属性中获取联合类型作为泛型。我想根据剩余属性中至少有一个不是字符串或数字的元素来有条件地设置函数的返回类型。
type TTranslationResult<T> = T extends number | string ? string : ReactNode;
export default function translate<T extends ReactNode = string>(
key: TDictionaryKey,
...params: T[]
): TTranslationResult<T> {
...
}
当我向函数发送这样的内容时,我希望 T 是
string | ReactNode
:
translate(
'XXX',
'some string',
<LinkText href={`foo`}>
{foo}
</LinkText>
)
相反,它推断数组中第一个属性的类型
您可以检查该元素是否为
string | number
,并根据情况返回 string
或 ReactNode
。
type TTranslationResult<T extends readonly unknown[]> = T extends [infer First, ...infer Rest]
? First extends string | number
? TTranslationResult<Rest>
: ReactNode
: string;
所以,如果
First
是 string | number
,它会递归地检查 Rest
,并检查所有元素是否都是 string | number
,它应该返回 string
,如果不是,它应该返回 ReactNode
。