A
Size: a a a
A
🧨
🧨
A
🧨
НС
// Тип описывает параметры поля какой-либо формы.
// T это тип значения поля, V это тип описывающий все значения формы
interface Field<T, V> {
name: string;
type: string;
validate: (value: T | null | undefined, allValues: V) => boolean;
}
// Это конкретный тип для строковых полей
interface StringField<T> extends Field<string, T> {
type: 'string',
}
// Это конкретный тип для числовых полей
interface NumberField<T> extends Field<number, T> {
type: 'number',
}
// Это тип описывающий список полей какой-либо формы
type Fields<T> = Field<any, T>[]
nterface Person {
name: string;
age: number;
}
const nameField: StringField<Person> = {
name: 'name',
type: 'string',
validate: (value: string | null | undefined, allValues: Person): boolean => {
return value != null && value !== '';
},
}
const ageField: NumberField<Person> = {
name: 'age',
type: 'number',
validate: (value: number | null | undefined, allValues: Person): boolean => {
return value != null && value > 0;
},
}
// В этом случае я ожидаю список полей для формы Person, и все поля имеют соответствующий дженерик.
// Тут я не ожидаю ошибок и их нет.
const fields: Fields<Person> = [nameField, ageField];
rface City {дскажите почему TypeScript не ругается, и как мне реализовать то поведение которое я хочу?
name: string;
}
// Намеренно указываю в качестве дженерика тип City вместо Person
const incorrectAgeField: NumberField<City> = {
name: 'age',
type: 'number',
validate: (value: number | null | undefined, allValues: City): boolean => {
return value != null && value > 0;
},
}
// Тут я хочу чтобы TypeScript ругнулся ошибкой, что-то типа такого:
// "incorrectAgeField must be Field<any, Person> but it is Field<any, City>".
// Но ошибок нет и TypeScript считает что это корректное выражение.
const incorrectFields: Fields<City> = [nameField, incorrectAgeField];
По
A
A
🧨
🧨
🧨
A
A
🧨
🧨
A
VP
A
VP