我有这个使用模板标签的工厂功能:
function logWithNamespace([ns]: TemplateStringsArray) {
return (...args) => console.log(ns, ...args);
}
const log = logWithNamespace `foo`;
log(1, 2, 3); // => 'foo', 1, 2, 3
现在我需要像这样添加函数签名:
function logWithNamespace<T>([ns]: TemplateStringsArray) {
return (thing: T) => console.log(ns, thing);
}
const log = logWithNamespace<number> `number`;
log(1); // => 'number', 1
我得到这个打字稿语法错误:
/*
* Operator '>' cannot be applied to types 'boolean' and 'string'.
*/
注意:我不想为此目的使用 Tagged template literals ,但这是一项要求。
注意: Tagged template literals可以返回与字符串不同的内容。
答案 0 :(得分:0)
正如@AlekseyL所提到的,你直接can't do that。
如果你愿意间接地,那总会有这样的事情:
const makeLogWithNamespace = <T>() => ([ns]: TemplateStringsArray) => {
return (thing: T) => console.log(ns, thing);
}
const log = makeLogWithNamespace<number>() `number`;
log(1); // => 'number', 1
函数makeLogWithNamespace<T>()
是一个泛型工厂,它返回一个非泛型logWithNamespace()
函数,其中T
被具体的东西替换,如number
。然后,您可以将其用作标记函数而不会出现问题。
对于开发人员来说,只需添加一组额外的括号,但它应该有效。希望有所帮助;祝你好运!
编辑:如果此解决方案对某人不起作用,请告诉我这是什么问题,以便我能解决。谢谢!