具有 UNIQUE 通用节点的通用树
Generic tree with UNIQUE generic nodes
问题描述
我有一个带有通用节点的通用树。您可以将其视为具有多级子元素的扩展路由器配置。
要注意的是,每个节点都可以有其父节点的其他通用类型(更多详细信息 - Typescript Playground)。
所以当节点有子节点时,问题在于键入其节点泛型。
代码
type ReactNode = string
type languageTag = 'en' | 'ru'/* | 'de' | 'cs' | 'fr' | 'cn' | 'pl' */
// the type below may be the problem
type translations<T extends unknown = unknown> = {
[key in languageTag]: T
}
interface pageData<T extends unknown = unknown> {
path: string,
contentTranslations: translations<T>
element: ReactNode,
children?: Array<pageData<T>>
}
const informationPageData: pageData<{ hobbies: string/* , fullName: string, birthDate: string, sex: string, ... */ }> = {
path: 'information',
contentTranslations: {
en: { hobbies: 'hobbies' },
ru: { hobbies: 'хобби' }
},
element: 'profile information'
}
const profilePageData: pageData<{ recentPosts: string }> = {
path: ':profileId',
contentTranslations: {
en: { recentPosts: 'recent posts' },
ru: { recentPosts: 'недавние посты' }
},
element: 'profile component',
children: [ informationPageData ] // Error
}
const profilesPageData: pageData<{ youMayKnow: string }> = {
path: '/profiles',
contentTranslations: {
en: { youMayKnow: 'you may know' },
ru: { youMayKnow: 'возможно вы знакомы' }
},
element: 'profiles list',
children: [ profilePageData ] // Error
}
问题
我应该从哪里获得这些类型?
目标是让它尽可能干。也许使用类型推断?
请问有什么需要帮助的吗?
pageData
接口的问题是 parent T
与 children 所需的类型相同。您想要的是打开通用类型以容纳任何记录,从而允许 children 定义自己的属性。
interface pageData<T extends Record<string, string>> {
path: string,
contentTranslations: translations<T>
element: ReactNode,
children?: Array<pageData<Record<string, string>>>
}
你仍然会得到组件 props 的强类型特性,但没有继承的限制
问题描述
我有一个带有通用节点的通用树。您可以将其视为具有多级子元素的扩展路由器配置。
要注意的是,每个节点都可以有其父节点的其他通用类型(更多详细信息 - Typescript Playground)。
所以当节点有子节点时,问题在于键入其节点泛型。
代码
type ReactNode = string
type languageTag = 'en' | 'ru'/* | 'de' | 'cs' | 'fr' | 'cn' | 'pl' */
// the type below may be the problem
type translations<T extends unknown = unknown> = {
[key in languageTag]: T
}
interface pageData<T extends unknown = unknown> {
path: string,
contentTranslations: translations<T>
element: ReactNode,
children?: Array<pageData<T>>
}
const informationPageData: pageData<{ hobbies: string/* , fullName: string, birthDate: string, sex: string, ... */ }> = {
path: 'information',
contentTranslations: {
en: { hobbies: 'hobbies' },
ru: { hobbies: 'хобби' }
},
element: 'profile information'
}
const profilePageData: pageData<{ recentPosts: string }> = {
path: ':profileId',
contentTranslations: {
en: { recentPosts: 'recent posts' },
ru: { recentPosts: 'недавние посты' }
},
element: 'profile component',
children: [ informationPageData ] // Error
}
const profilesPageData: pageData<{ youMayKnow: string }> = {
path: '/profiles',
contentTranslations: {
en: { youMayKnow: 'you may know' },
ru: { youMayKnow: 'возможно вы знакомы' }
},
element: 'profiles list',
children: [ profilePageData ] // Error
}
问题
我应该从哪里获得这些类型?
目标是让它尽可能干。也许使用类型推断?
请问有什么需要帮助的吗?
pageData
接口的问题是 parent T
与 children 所需的类型相同。您想要的是打开通用类型以容纳任何记录,从而允许 children 定义自己的属性。
interface pageData<T extends Record<string, string>> {
path: string,
contentTranslations: translations<T>
element: ReactNode,
children?: Array<pageData<Record<string, string>>>
}
你仍然会得到组件 props 的强类型特性,但没有继承的限制