如何从其余属性推断联合类型?

问题描述 投票:0回答:1

我想从其余属性中获取联合类型作为泛型。我想根据剩余属性中至少有一个不是字符串或数字的元素来有条件地设置函数的返回类型。

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

相反,它推断数组中第一个属性的类型

reactjs typescript
1个回答
0
投票

您可以检查该元素是否为

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

© www.soinside.com 2019 - 2024. All rights reserved.