возьми меня
я есть метод, который должен принимать любой объект, если все его поля являются строками или числами
Я сделал это, что прекрасно работает с типизацией утки
static interpolateParams(
route: string,
params: {[key: string] : string | number}) : string {
const parts = route
.split("/")
.map(part => {
const match = part.match(/:([a-zA-Z09]*)\??/);
if (match) {
if (!params[match[1]]) {
console.error("route argument was not provided", route, match[1]);
return part;
}
return params[match[1]];
}
else {
return part;
}
})
return "/" + parts.slice(1).join("/");
}
и позвонить
interpolateParams("/api/:method/:value", {method: "abc", value: 10});
Теперь я хочу сделатьinterpolateParams
принять любой интерфейс для маршрутаparams
.
interpolateParams<IABCParams>("/api/:method/:value", {method: "abc", value: 10});
Проблема в том, что он все еще должен соответствовать ограничениям для всех полей, являющихся строками или числами
Есть ли способ указать общее ограничение для всех полей данного интерфейса, чтобы иметь определенный тип?
Я пробовал это
static interpolateParams<T extends {[key: string] : string | number}>(
route: string,
params: T) : string {
и, очевидно, получил это
Тип 'IABCParams' не удовлетворяет ограничению '{[key: string]: string | номер; }».
Подпись индекса отсутствует в типе 'IABCParams'.
Спасибо