#typescript
Вопрос:
Я новичок в машинописи, поэтому у меня есть вопросы по этому поводу. Один из них заключается в следующем:
function fill**<IDontKnow>**(array: any[], value: IDontKnow): IDontKnow[] {
return array.map(() => value);
}
Я понимаю назначение всех написанных дженериков, кроме того, что обозначено звездочками. Что это значит/делает?
Комментарии:
1. Предоставляя тип в
IDontKnow
качестве универсального, вы сообщаете компилятору, чтоvalue
аргумент будет иметь этот тип, а выводом будет массив этого типа2. Как вы думаете, как это должно быть написано, без объявления параметра типа для функции?
Ответ №1:
Дженерики обычно используются для двух целей:
- Чтобы сообщить компилятору о выводе/замене типа из ссылки.
- Чтобы указать компилятору принудительно ввести тип в целевой объект.
Проверьте этот пример на основе вашего фрагмента (или представления на игровой площадке).:
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
}
// ...
}