首页 > 解决方案 > 对象文字键值作为类型(Typescript)。我做对了/做对了吗?

问题描述

我有文字对象,我希望能够将它用作函数中的参数,例如

const SOCIAL_PROVIDER = {
  Google: 'Google',
  Facebook: 'Facebook'
}

handle(SOCIAL_PROVIDER.Google) // OK
handle(SOCIAL_PROVIDER.Twitter) // want TS to throw error
handle('Google') // want TS to throw error

然后是函数签名类型,我让它工作的唯一方法如下

type SocialProvider = {
  Google: 'Google',
  Facebook: 'Facebook'
};

const SOCIAL_PROVIDER: SocialProvider = {
  Google: 'Google',
  Facebook: 'Facebook'
};

type handle = (value: keyof typeof SOCIAL_PROVIDER) => void

我做得对还是正确处理?还是有更好的方法?

谢谢。

标签: javascripttypescript

解决方案


就我个人而言,我认为仅使用您的 Providers 创建一个类型既好又简单..

例如..

type SOCIAL_PROVIDER = 'Google' | 'Facebook';
const SOCIAL_PROVIDER_HANDLE: Record<SOCIAL_PROVIDER, string> = {
  Facebook: 'FB',
  Google: 'GOOGLE'
}

function handle(provider: SOCIAL_PROVIDER) {
  console.log(SOCIAL_PROVIDER_HANDLE[provider]);  
}

handle('Google') // OK
handle('Twitter') // want TS to throw error

TS游乐场

如果你想保持干燥,另一个想法。例如。在上面GoogleFacebook重复,您可以让 TS 为您构建类型。

例如。

const SOCIAL_PROVIDER_HANDLE = {
  Facebook: 'FB',
  Google: 'GOOGLE'
};

type SOCIAL_PROVIDER = keyof typeof SOCIAL_PROVIDER_HANDLE;

function handle(provider: SOCIAL_PROVIDER) {
  console.log(SOCIAL_PROVIDER_HANDLE[provider]);  
}

handle('Google') // OK
handle('Twitter') // want TS to throw error

推荐阅读