reactjs - 基于输入对象的返回类型 Typescript 自动完成

标签 reactjs typescript

更新:感谢https://stackoverflow.com/users/5575595/drag13完整版本可以在这里找到:https://github.com/web-ridge/react-ridge-translations/blob/main/src/index.ts

我正在开发 React/React Native 的翻译库,但我无法让这些类型工作。

https://github.com/web-ridge/react-ridge-translations

您可以通过以下方式创建翻译

// first describe which languages are allowed/required (Typescript)
type TranslationLanguages = {
    nl: string
    fr: string
    en: string
}

// create a translation object with your translations
export default const translate = createTranslations<TranslationLanguages>({
  homeScreen:{
    yesText: {
      nl: 'Ja',
      fr: 'Oui',
      be: 'Yes',
    },
    welcomeText: ({ firstName }: { firstName: string }) => ({
      nl: `Hoi ${firstName}`,
      fr: `Hello ${firstName}`,
      be: `Hello ${firstName}`,
    }),
  }
}, {
    language: 'nl',
    fallback: 'en',
})

库将对象更改为以下内容

{
  homeScreen:{
    yesText: 'Ja',
    welcomeText: ({ firstName }: { firstName: string }) => `Hoi ${firstName}`,
  }
}

在您的组件中,您将以这种方式使用类型

  const {yesText,welcomeText} = translate.use().appScreen

它不会自动完成类型。

库代码(简化)

type val<T> = (...params: any[]) => T
type val1<T> = T

type Translations<T> = {
    [group: string]: {
        [key: string]:  val<T> | val1<T>
    },
}
type TranslationsObject<T> = {
    translations: Translations<string>,
    use: () => Translations<string>;
}
export function createTranslations<T>(t: Translations<T>): TranslationsObject<T> 

如何让 Typescript 了解它需要自动完成?

最佳答案

因此,您希望允许 TypeScript 自己定义接口(interface)。在这种情况下,您需要使用更多的泛型。像这样的事情:

type ValueOf<T> = T[keyof T]; 
type Translations<TGroup> = {
   [group in keyof TGroup]: { [key in keyof ValueOf<TGroup>]: ValueOf<TGroup>[key] }
}

type TranslationsObject<TGroup> = {
    translations: Translations<TGroup>,
    use: () => Translations<TGroup>;
}

export function createTranslations<TGroup>(data: TGroup): TranslationsObject<TGroup> { }


const test = createTranslations({
  homeScreen:{
    yesText: {
      nl: 'Ja',
      fr: 'Oui',
      be: 'Yes',
    },
    welcomeText: ({ firstName }: { firstName: string }) => ({
      nl: `Hoi ${firstName}`,
      fr: `Hello ${firstName}`,
      be: `Hello ${firstName}`,
    }),
  }
});

const x  = test.use().homeScreen.yesText

类型检查目前应该可以正常工作。这个看起来不错吗?

使用评论中的代码进行更新

关于reactjs - 基于输入对象的返回类型 Typescript 自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62717923/

相关文章:

javascript - 有没有一种方法可以仅将 Gatsby 用于静态 html 文件而不使用 webpacked javascript 文件?

python - Graphene-django - 如何捕获查询响应?

javascript - 从同一组件链接到组件不起作用

reactjs - 假设 .jsx 以 webpack 结尾的 ES6 导入语句

reactjs - 为什么 React 中的排列计算器会得到荒谬的结果?

reactjs - 如何在reactjs中禁用 future 日期?

javascript - 滚动时 Angular 5 粘性菜单

typescript - 有没有一种简单的方法可以从 typescript 中的枚举中获取键/数字列表?

typescript - Ctor 不是构造函数

angular - 如何在不使用angular 2+中的ngmodel的情况下为输入设置一个值