Typescript 基于输入参数类型的类型脚本类型

Typescript 基于输入参数类型的类型脚本类型,typescript,generics,typescript-generics,Typescript,Generics,Typescript Generics,我正试着做如下的事情 const useTeams=(urlFriendlyNameOrId?:字符串)=>{ const[team,settam]=useState(); //在useState内部,我希望它计算为是否有提供的字符串 //我尝试过useState()将始终为我提供团队[] //我已经尝试过useState我不会直接回答这个问题,因为我认为您在这里走错了方向。不可能使用条件挂钩,这意味着如果您的挂钩可以同时处理-array和单个对象,这也是类型定义 由于要缩小类型的范围,唯一的方

我正试着做如下的事情

const useTeams=(urlFriendlyNameOrId?:字符串)=>{
const[team,settam]=useState();
//在useState内部,我希望它计算为是否有提供的字符串
//我尝试过useState()将始终为我提供团队[]

//我已经尝试过useState我不会直接回答这个问题,因为我认为您在这里走错了方向。不可能使用条件挂钩,这意味着如果您的挂钩可以同时处理-array和单个对象,这也是类型定义

由于要缩小类型的范围,唯一的方法是设置类型保护,因此不能使用钩子来完成,因此需要在初始化后设置类型保护

看看下面的代码,我认为这是您真正想要做的:

// just example type as you haven't provided such
type Team = {
    name: string;
}

function useTeams(urlFriendlyNameOrId?: string) {
    const [teams, setTeams] = useState<Team | Team[]>(
urlFriendlyNameOrId ? {name: urlFriendlyNameOrId} : []);

    if (Array.isArray(teams)) {
        teams // array
    } else {
        teams // single team
    }
}

看看我关于这个主题的文章-

你在这里做错了什么,你想要达到什么更广泛的背景?我关心的是-你应该无条件地初始化hook,因为这是规则,这意味着hook应该始终与union
Team | Team[]打交道
,你不能在初始化级别缩小范围,你可以在初始化之后这样做。是的,我想我对我想要的东西太笼统了。我想要一个一般情况,如果你不提供URL,它将返回所有团队,而如果你提供URL,它将只返回该团队。我可能想把它分成两个不同的挂钩或者重构它。
function useTeams(urlFriendlyNameOrId?: string) {
    const [teams, setTeams] = useState<Team[]>(
urlFriendlyNameOrId ? [{name: urlFriendlyNameOrId}] : []);

    teams // it can be or empty or one element array of teams
}