TS - 标记模板文字和函数签名

时间:2017-09-05 11:51:01

标签: typescript types

我有这个使用模板标签的工厂功能:

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可以返回与字符串不同的内容。

1 个答案:

答案 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。然后,您可以将其用作标记函数而不会出现问题。

对于开发人员来说,只需添加一组额外的括号,但它应该有效。希望有所帮助;祝你好运!

编辑:如果此解决方案对某人不起作用,请告诉我这是什么问题,以便我能解决。谢谢!