我有以下介面,可以說:
interface A {
innerA: InnerA;
innerB: InnerB;
}
interface InnerA {
items: Item[];
name: string;
counter: number;
}
interface InnerB {
address: string;
code: number;
}
interface Item {
id: number;
}
我想要實作的是創建一個型別或介面,它具有與介面“A”相同的鍵(包括嵌套物件的鍵),但這些鍵中的每一個都應該具有“字串”型別的值,或者,如果它是一個物件,遞回地獲取它的鍵并生成“字串”型別的值。如果鍵具有陣列型別的對應值(如 InnerA.items),則“items”鍵的值應為“Item”型別。
以下物件應該描述我想要獲得的內容,但我無法為此找到合適的型別:
const labels: CloneType<A> = {
innerA: {
items: { id: 'ID' },
name: 'Some Name',
counter: 'Some Counter'
},
innerB: {
address: 'Address',
code: 'Postal Code'
}
}
const postalCodeLabel: string = labels.innerB.code;
const itemIdLabel: string = labels.innerA.items.id;
我嘗試了以下方法,但堅持轉換陣列型別并且還努力使其遞回:
type CloneType<Model> = {
// take keys of generic type
[modelKey in keyof Model]: {
// take fields of nested types
[field in keyof Model[modelKey]]: string;
}
}
老實說,我懷疑是否有可能僅使用純型別來實作我想要做的事情,但誰知道呢,也許這是可能的,有人可以提供幫助。
uj5u.com熱心網友回復:
檢查它是否是一個陣列,如果是,我們克隆元素型別,否則,如果它是一個物件,我們克隆它,如果它不是其中任何一個,則回傳一個字串。請注意,這會因為諸如此類的事情Map而中斷,Set因為這些都算作物件,因此您最終會得到諸如此類{ has: string; add: string; ... }的事情。
type CloneType<T> = {
[K in keyof T]:
T[K] extends (infer E)[]
? CloneType<E>
: T[K] extends object
? CloneType<T[K]>
: string;
}
假設您的輸入很簡單,它應該可以作業。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510417.html
標籤:打字稿打字稿泛型
