在Typescript中是否可以有基于另一个类型的动态类型?

rxztt3cl  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(170)

我有这样一种类型:

type PageList = 'login' | 'register' | 'dashboard'

对于每个页面,它都有一个不同的对象要发送,例如:

const PageParam = [
  { 
    login: {
     isAuthenticated: true
    }
  },
  { 
    register: {
     isRegistered: false
    },
  },
    
]

我需要在如下函数中使用它:

function moveTo(pageName: PageList, bodyParam: ???) {
  /* Some Logic */
}

// I want it goes this way
// JUST EXAMPLE!!
if (pageName === 'login') typeof bodyParam = { isAuthenticated: boolean }
if (pageName === 'register') typeof bodyParam = { isRegistered: boolean }

我需要这些 bodyParampageName 之后具有类型,这样我就可以发送正确的参数,而无需再次检查类型文件。
有没有什么可能的办法可以做到这一点?

vql8enpb

vql8enpb1#

是的,你可以设置一个类型字典的等价物:

type PageParam = {
    login: {
        isAuthenticated: boolean
    },
    register: {
        isRegistered: boolean
    },
    dashboard: {}
}

function moveTo<T extends PageList>(pageName: T, bodyParam: PageParam[T]) {
  /* Some Logic */
}

moveTo('login', {
    isAuthenticated: true // Okay
})

moveTo('register', {
    isAuthenticated: true // Error: Argument of type '{ isAuthenticated: boolean; }' is not assignable to parameter of type '{ isRegistered: boolean; }'
})

Playground链接

相关问题