Как придать объектное ограничение обобщениям T в машинописном тексте?

#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 типа заключается в том , что он не знает о типе, к которому он придет, и он будет исправлен с помощью правильного типа.