我想指定一個名為的型別Item,它有可能被嵌套如下:
任何一個
type Item {
...;
item: Item;
answer: {
...;
//(does not contain property "item")
}
}
或者
type Item {
...;
//(does not contain property "item")
answer: {
...;
item: Item
}
}
即,該Item型別可以item:Item作為直接子屬性,也可以作為屬性下方的孫子屬性,answer但不能同時具有兩者。
背景關系:我正在嘗試從 FHIR 規范中實作 QuestionnaireResponse 資源的 item 屬性
uj5u.com熱心網友回復:
這應該可以解決問題:
type FirstOrSecondLayer<T, I, A extends string> = XOR<T & I, T & Record<A, I>>
type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
type XOR<T, U> = (T | U) extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;
type Item = Expand<FirstOrSecondLayer<{
a: string
b: string
answer: {
c: string
}
},{
item: Item
}, "answer">
>
這里發生了很多事情。我添加了一些額外的屬性a,b并c用于演示目的。您傳遞沒有 itemas的型別T。I是獨占物件型別。并為A您傳遞嵌套的屬性的名稱I。
我使用了here和from hereExpand的型別。XOR
以下是一些測驗用例:
const t1: Item = {
a: "",
b: "",
item: {} as Item,
answer: {
c: ""
}
} // works
const t2: Item = {
a: "",
b: "",
answer: {
c: "",
item: {} as Item,
}
} // works
const t3: Item = {
a: "",
b: "",
item: {} as Item,
answer: {
c: "",
item: {} as Item, // error
}
}
讓我知道這是否適用于您的用例。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/472031.html
下一篇:通信組件的服務僅適用于一個
