[英]Dynamic property keys and values on Typescript Interface dependent on other fields
我是 Typescript 的新手,我想知道是否有办法完成以下任务:
我想输入一些我通过它们的两个不同端点发送到 Hubspot 的属性,这些 API 中的每一个都使用名为property
的键和另一个名为name
的键接收数据。 这意味着它们可以是这样的:
{
property: 'email',
value: 'test@email.com'
}
或者:
{
name: 'email',
value: 'test@email.com'
}
然后,我想验证我只发送了一些特定的字段。 说这个:
export interface HubspotFields {
newsletter: boolean;
name: string;
email: string;
}
那么,有没有办法做这样的事情?:
export interface Test {
[either "property" or "name"]: [keyof HubspotFields (value can only be one of the keys from HubspotFields)];
value: [the type of the corresponding dynamic keyof HubspotFields (string
boolean)];
}
换句话说:
//This fails
{
something: 'email',
value: 'test@email.com'
}
//This fails
{
property: 'something',
value: 'test@email.com'
}
//This fails
{
property: 'email',
value: 2312
}
//This passes
{
property: 'newsletter',
value: true
}
//This passes
{
name: 'email',
value: 'test@email.com'
}
希望我想要完成的事情足够清楚,如果不是,我很乐意详细说明。 提前致谢!
我认为,以下类型可以满足您的需求:
// ensure return type of boolean or string
type StringOrBoolReturn = {
[K: string]: boolean | string
}
export interface HubspotFields extends StringOrBoolReturn {
newsletter: boolean;
name: string;
email: string;
}
// support either property XOR name
type ApiData<K extends keyof HubspotFields = keyof HubspotFields> = {
property: K
name?: never
value: HubspotFields[K]
} | {
property?: never
name: K
value: HubspotFields[K]
}
function sendApiData<K extends keyof HubspotFields>(data: ApiData<K>) {/*... logic ...*/}
sendApiData({ something: 'email', value: 'test@email.com' }) // ✖
sendApiData({ property: 'something', value: 'test@email.com' }) // ✖
sendApiData({ property: 'email', value: 2312 }) // ✖
sendApiData({ name: 'email', property: "email", value: 'test@email.com' }) // ✖
sendApiData({ property: 'newsletter', value: true }) // ✔
sendApiData({ name: 'email', value: 'test@email.com' }) // ✔
sendApiData({ name: 'email', value: 'test@email.com' }) // ✔
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.