簡體   English   中英

依賴於其他字段的 Typescript 接口上的動態屬性鍵和值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM