TypeScript'te özyinelemeli nesne eşleyici türü
Typescript'te tip güvenli bir nesne eşleyici oluşturuyorum.
Bu oyun alanı ve bu kod ile bunu bir seviye derinlikle çalıştırabilirim
enum TransformerActions {
Delete = 'delete',
}
type TransformerMap<S> = {
[P in keyof S]?: S[P] extends object
? ((s: S) => any) | TransformerActions
: S[P];
};
interface Name {
forename?: string;
surname?: string;
}
type Person = { currentName: Name, previousNames: Name[] }
const personTransformer1: TransformerMap<Person> = {
currentName: TransformerActions.Delete
}
const personTransformer2: TransformerMap<Person> = {
currentName: (s) => s.currentName.forename + ' ' + s.currentName.surname
}
Ama eğer bunu özyinelemeli bir tür yapmak isteseydim, böylece her iç içe anahtar dönüşümler içerebilseydi, sözdizimini bulamıyorum, bunu denedim:
type TransformerMap<S> = {
[P in keyof S]?: S[P] extends object
? TransformerMap<S[P]>
: S[P] | ((s: S) => any) | TransformerActions;
};
Ama bu işe yaramıyor.
Bu şekilde bir özyinelemeli tip nasıl oluşturabilirim.
Cevap #1
Eğer doğru anladıysam, bunun gibi bir şey hakkında ne düşünüyorsun?
enum TransformerActions {
Delete = 'delete',
}
type TransformerFunc<T> = (src: T) => Partial<T>
type TransformerMap<S> = {
[P in keyof S]?: S[P] | TransformerFunc<S[P]> | TransformerActions | TransformerMap<S[P]>;
};
interface Name {
forename?: string;
surname?: string;
}
type Person = { currentName: Name, previousNames: Name[], child: Person }
const personTransformer1: TransformerMap<Person> = {
currentName: TransformerActions.Delete
}
const personTransformer2: TransformerMap<Person> = {
currentName: {
forename: TransformerActions.Delete
},
child: {
currentName: (child) => {
return {
forename: `${child.forename?.toUpperCase()} ${child.surname?.toUpperCase}`,
surname: TransformerActions.Delete
}
},
child: TransformerActions.Delete
}
}
Oyun alanı örneğini inceleyin.
