作者:哗锅_348 | 来源:互联网 | 2022-12-02 16:59
我有一个方法,它可以接受任何对象,只要它的所有字段都是字符串或数字
我做了这个,非常适合鸭子打字
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
接受route的任何接口params
。
interpolateParams("/api/:method/:value", {method: "abc", value: 10});
问题是它仍然应该匹配所有字符串或数字字段的约束
有没有一种方法可以在给定接口的所有字段上将泛型约束指定为特定类型?
我尝试过
static interpolateParams(
route: string,
params: T) : string {
显然得到了这个
类型'IABCParams'不满足约束'{{[key:string]:string | 数; }'。
类型“ IABCParams”中缺少索引签名。
谢谢
1> Matt McCutch..:
T
的约束可以引用T
(有一些约束),因此您可以使用映射类型来生成与以下字段具有相同字段的约束T
:
function interpolateParams(
route: string,
params: T) : string { /*...*/ }
请注意,使用圆形类型参数约束的欺骗有时可能会导致问题,尽管这种情况可能是可以的。