3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
這個(gè)答案非常(過度)復(fù)雜,但你最終會得到這種類型:
const userDetails = parseFields(fields);
type Z = typeof userDetails;
// type Z = {
// address: {
// city: "Tulsa" | "Norman"; // Added to test
// state: "OK";
// };
// } & {
// firstName: "Bob";
// lastName: "Smith";
// }
它需要制作fields as const:
const fields = [
...
] as const;
還有……實(shí)際的打字:
type AddressKeys = 'city' | 'street' | 'state' | 'suite' | 'zipCode';
type _ParseFieldsResultKeys<T extends readonly FieldProps[]> = {
[K in keyof T]: T[K] extends { name: string } ? T[K]['name'] : never;
}[Exclude<keyof T, keyof []>];
type _GetParseFieldResultValue<T extends readonly FieldProps[], N> =
Extract<T[keyof T], { name: N }> extends { value: infer V } ? V : never;
type ParseFieldsResult<T extends readonly FieldProps[]> = {
address: {
[N in Extract<_ParseFieldsResultKeys<T>, AddressKeys>]: _GetParseFieldResultValue<T, N>;
}
} & {
[N in Exclude<_ParseFieldsResultKeys<T>, AddressKeys>]: _GetParseFieldResultValue<T, N>;
};
const parseFields = <T extends readonly FieldProps[]>(fields: T): ParseFieldsResult<T> => {
使用它可能不是一個(gè)好主意。但是:游樂場鏈接
編輯:意識到我們不需要實(shí)際的字符串文字類型,只需要string我們可以擺脫_GetParseFieldResultValue并仍然得到的值:
type Z = {
address: {
city: string;
state: string;
};
} & {
firstName: string;
lastName: string;
}

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
在 parseFields 函數(shù)中,你有一個(gè) K.. 的返回類型,它是一個(gè)空對象......你不應(yīng)該傳入 FieldProps 嗎?
const parseFields = <T extends any[], K extends object = {}>(fields: T): **FieldProps** => {

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
您在此處使用通用方法,并將 K 的默認(rèn)類型設(shè)置為 {},這就是您在懸停時(shí)看到 {} 的原因。
您可以通過正確調(diào)用該方法來實(shí)現(xiàn)您正在尋找的東西。像這樣:
const userDetails = parseFields<FieldProps[], {
"firstName": string,
"lastName": string,
"address": {
"city": string,
"state": string
}
}>(fields);
添加回答
舉報(bào)