Угловой, передайте универсальный тип в другую функцию. Как ввести параметр?

#javascript #angular #typescript #replace #generic-type-parameters

Вопрос:

У меня есть такая функция, как:

 getSomething<T>(value: T): any{
    const temp = this.doSomething<T>(value);
...
}

doSomething<T>(value: T): any {
    return value.replace(/s/g, '');
}
 

Изначально переданное значение имеет определенный тип T, я прекрасно знаю, что в конечной функции это будет строка. Однако, делая это таким образом, я не могу использовать функцию замены. Справка.

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

1. Попробовать return <string>value.replace() ? Или (value as string).replace()

Ответ №1:

Вам нужно сказать, что значение будет иметь строковые методы. Подобный этому:

 getSomething<T extends string>(value: T): any{
    const temp = this.doSomething<T>(value);
...
}

doSomething<T extends string>(value: T): any {
    return value.replace(/s/g, '');
}
 

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

1. Ха, это интересно, я никогда не знал об этом

Ответ №2:

Подумайте о своей проблеме следующим образом:

  1. Как я могу быть уверен, что указанный тип имеет метод «заменить ()»?
  2. Что произойдет, если я укажу другой тип, например, число или нуль?

Вы должны каким-то образом сообщить Typescript, что вы ожидаете получить аргумент с методом «replace()». Вы можете сделать это, создав дополнительный интерфейс и упомянув, что универсальный тип расширяет этот интерфейс:

 interface Replacable {
  replace: (regexp: RegExp, str: string) => string
}

function getSomething<T extends Replacable>(value: T): any{
    const temp = doSomething<T>(value);
    console.log(temp);
}

function doSomething<T  extends Replacable>(value: T): any {
    return value.replace(/s/g, '');
}
 

Подробнее об общих ограничениях читайте здесь: https://www.typescriptlang.org/docs/handbook/2/generics.html#generic-constraints