typescript - Länka objekt nyckel med returvärde som returneras av funktion
// try trim string
export default function safeTrim(value: unknown): string | undefined {
if (typeof value === 'string') {
return value.trim();
}
return undefined;
}
// index and items used for array
type Validator<T extends object> = (item: T, index?: number, items?: T[]) => null | { [key in keyof T]: string[] };
export function emptyValidator<T extends object>(keyName: keyof T): Validator<T> {
return (item) => {
if (!safeTrim(item[keyName])) {
// @ts-ignore
const error: { [key in keyof T]: string[]} = { // line 18
[keyName]: [`Field should not be empty`],
};
return error;
}
return null;
};
}
// ======= examples usage ========
const testObject = {
propThatReturnNull: 'some string',
propThatReturnError1: '',
propThatReturnError2: undefined,
propThatReturnError3: null
} as const;
emptyValidator('propThatReturnNull')(testObject); // should return null
emptyValidator('propThatReturnError1')(testObject); // should return {propThatReturnError1: [`Field should not be empty`]}
emptyValidator('propThatReturnError2')(testObject); // should return {propThatReturnError2: [`Field should not be empty`]}
emptyValidator('propThatReturnError3')(testObject); // should return {propThatReturnError3: [`Field should not be empty`]}
På rad 18 får jag fel Typ '{ [x: string]: string[]; }' kan inte tilldelas typen '{ [key in keyof T]: string[]; }'.
Jag förväntade mig att keyName-typen är "keyof T" istället för "string".
Hur matchar jag objektets nyckeltyp och den returnerade objektets nyckeltyp?
exempel på ts-lekplats
Svar #1
Typen { [key in keyof T]: string[] } är en mappad typ och den kan inte härledas automatiskt av TypeScript i funktionsimplementeringen, så du måste ange returvärdets typ explicit:
export function emptyValidator<T extends object>(keyName: keyof T): Validator<T> {
return (item) => {
if (!safeTrim(item[keyName])) {
return {
[keyName]: [`Field should not be empty`],
} as { [key in keyof T]: string[] };
}
return null;
};
}
