#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:
Подумайте о своей проблеме следующим образом:
- Как я могу быть уверен, что указанный тип имеет метод «заменить ()»?
- Что произойдет, если я укажу другой тип, например, число или нуль?
Вы должны каким-то образом сообщить 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