Зачем нам нужно писать общие функции в типографском тексте? Например, функция fill(){}

#typescript

Вопрос:

Я новичок в машинописи, поэтому у меня есть вопросы по этому поводу. Один из них заключается в следующем:

 function fill**<IDontKnow>**(array: any[], value: IDontKnow): IDontKnow[] {
  return array.map(() => value);
}
 

Я понимаю назначение всех написанных дженериков, кроме того, что обозначено звездочками. Что это значит/делает?

Комментарии:

1. Предоставляя тип в IDontKnow качестве универсального, вы сообщаете компилятору, что value аргумент будет иметь этот тип, а выводом будет массив этого типа

2. Как вы думаете, как это должно быть написано, без объявления параметра типа для функции?

Ответ №1:

Дженерики обычно используются для двух целей:

  1. Чтобы сообщить компилятору о выводе/замене типа из ссылки.
  2. Чтобы указать компилятору принудительно ввести тип в целевой объект.

Проверьте этот пример на основе вашего фрагмента (или представления на игровой площадке).:

 function fill<T>(array: any[], value: T): T[] {
  return array.map(() => value);
}


/* Purpose 1: To tell the compiler to infer/substitute a type from a reference. */

// T is automatically inferred as `string` type, and in turn the type of `infer0` is automatically inferred as `string[]`.
const infer0 = fill([null, null, null], 'hello');

// T is automatically inferred as `number` type, and in turn the type of `infer1` is automatically inferred as `number[]`.
const infer1 = fill([null, null, null], 1);

// T is automatically inferred as `boolean` type, and in turn the type of `infer2` is automatically inferred as `boolean[]`.
const infer2 = fill([null, null, null], false);


/* Purpose 2: To tell the compiler to force a type onto a target. */

// T is forced to be `string`, so now the `value` argument have to be a value of type `string`.
const force0 = fill<string>([null, null, null], 1);   // should error

// T is forced to be `number`, so now the `value` argument have to be a value of type `number`.
const force1 = fill<number>([null, null, null], false);   // should error

// T is forced to be `boolean`, so now the `value` argument have to be a value of type `boolean`.
const force2 = fill<boolean>([null, null, null], 'hello');   // should error
 

Это fill**<T>** просто синтаксис для объявления универсального с именем T , где T может быть любое имя.

Это то же самое понятие, что и объявление переменной. Когда вы это делаете const T = 'hello' , вы объявляете постоянную переменную и даете ей имя T .

Ответ №2:

Вы новичок в машинописи или вы новичок в разработке программного обеспечения? Дженерики-это не вещь для машинописи, их используют многие языки: java, c#; и это лишь некоторые из них.

По сути, единственная их цель-чтобы происходили сухие вещи.

 const VALUE = Symbol(“value”);
const NEXT = Symbol(“next”);

class Node<T> {
  private [VALUE]: T;
  private [NEXT]: T;

  constructor(value: T) {
    this[VALUE] = value;
    this[NEXT] = null;
  }
}
 

Как вы можете видеть, мы создали универсальный класс, форма узлов которого может быть ограничена вашим воображением или воображением каждого из нас. Я использую этот пример, потому что он находится в каждом отдельном дне плохой дивелопы Java.

Теперь давайте проведем занятие по списку

 const ROOT =Symbol(“root”);
const SIZE = Symbol(“size”);

type Item<T> = Node<T>;

class LinkedList<ITem {
[ROOT]: Item<
  constructor() {
    this.root = null; // first/head/root element
    this.size = 0; // total number of elements in the list
  }

  // ...
}