#typescript #typescript-generics
Вопрос:
Как придать объектное ограничение обобщениям?
Я попробовал использовать следующий подход
const arr = <T extends Record<string, unknown>> (list: T[]) => {
}
arr<List>(list) //error at this line
// Type of list
interface List{
name: string;
age: number;
}
Здесь я получаю ошибку типа как
type List[] is not assignable to Record<string, unknown>[]
Я попробовал с object
типом вместо Record
. Но я получил ошибку lint, так как объект
означает нулевое значение.
Комментарии:
1.
any
вместоunknown
этого ?2. Никаких явных правил для линтинга.
3. ну, да, конечно, но если вам нужен
AnyObject
тип, его подпись такова[key: string]: any
.4. Мне нужно какое-то объяснение, почему мы нуждаемся
any
здесь вместоunknown
этого . Не могли бы вы указать это в ответе?5. Есть также
object
, если у вас нет другого правила, запрещающего это тоже
Ответ №1:
Используйте Record<string, any>
вместо Record<string, unknown>
. Если мы не знаем, какой это будет тип, то его лучше поставить any
.
type Any = any;
const arr = <T extends Record<string, Any>> (list: T[]) => {
}
Здесь Any
это отличается от того any
, что значение Any
типа заключается в том , что он не знает о типе, к которому он придет, и он будет исправлен с помощью правильного типа.