В настоящее время индексированный тип доступа возвращает объединение всех типов в объекте. Как ограничить индексированный тип типом ключа?
interface User {
id: string,
name: string,
age: number,
token: string | null,
}
interface Updates<Schema> {
set: Partial<Record<keyof Schema, Schema[keyof Schema]>;
}
const test: Updates<User> = {
set: {
name: 1 // This should not work
}
}
@jsejcksn set должен быть частичной записью ключей схемы. Я опустил его для простоты.
@jsejcksn Привет, я отредактировал образец, чтобы лучше отразить проблему. Не могли бы вы взглянуть?






Вы можете использовать утилиту типов Partial<Type> непосредственно для существующего типа, чтобы сделать все его свойства необязательными:
interface User {
id: string;
name: string;
token: string | null;
}
interface Updates<T> {
set: Partial<T>;
}
const test: Updates<User> = {
set: {
name: /* still needs a value */,
//^? (property) name?: string
},
};
Извините за путаницу, это не то, о чем я спрашивал. Они у меня уже есть как частичные. Я просто хочу, чтобы значения имели тот же тип, что и определенный в схеме.
Partial. Вам просто нужно использовать его с вашим существующим типом.
Возможно, проще увидеть проблему на Typescript Playground Если навести курсор на name место, где находится комментарий, то видно, что тип имени в виде строки | ноль | неопределенный
Вау, не думал, что это будет так просто. Большое спасибо! Также я повторно отредактировал вопрос, который должен сделать проблему очень очевидной для всех остальных.
Вы можете просто повторно использовать свой пользовательский интерфейс
interface User {
id: string,
name: string,
token: string | null,
}
interface Updates<Schema> {
set: Partial<Schema>;
}
const test: Updates<User> = {
set: {
name: null // Type 'null' is not assignable to type 'string | undefined'
}
}
В интерфейсе
Updatesтипsetможет быть простоSchema. Это то, к чему вы стремились, или в вопросе отсутствуют какие-то дополнительные критерии?