此表达式不可调用。类型“字符串”没有呼叫签名

时间:2020-09-09 02:07:03

标签: node.js typescript types

我正在尝试从一个对象创建模板文件,该对象的键可以是字符串,也可以是返回字符串的函数:

export const createDynamicTemplate = (
  templateParams: CreateDynamicTemplateParams
) => {
  const { template, projectPath = '', param = '' } = templateParams
  const updatedTemplateArr = Object.keys(template).map((key: string) => {
      return {
        [key]: {
          filePath: `${projectPath}/${key}`,
          template: typeof template[key] === 'function' ? 
          template[key](param) : template[key],
        },
      }
  })
  const updatedTemplate = Object.assign({}, ...updatedTemplateArr)
  return updatedTemplate
}

我的界面是:

export interface TemplateObject {
  [key: string]: string
}

export interface FunctionalTemplateObject {
  [key: string]: (param: string) => void
}

export interface CreateDynamicTemplateParams {
  template: FunctionalTemplateObject | TemplateObject
  projectPath: string
  param: string
}

尽管如此,它仍会在createDynamicTemplate中引发此错误:

该表达式不可调用。 并非'string |类型的所有成分(((param:string)=> void)'是可调用的。 类型“字符串”没有呼叫签名。

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

检查引用对象的变量的子属性的类型不会缩小变量对象的类型。您可以先将键中的值保存在单独的变量中,然后检查该值以缩小其类型:

isClean

或者更好的是,使用method Main() { var a := new int[3]; a[0], a[1], a[2] := 1,2,3; var v := isClean (a, 1); assert a[0] == 1; assert v == false; } method isClean(a: array <int>, key: int) returns (clean: bool) requires a.Length > 0 ensures clean <==> (forall k :: 0 <= k < a.Length ==> a[k] != key) { var i := 0; while (i < a.Length) invariant 0 <= i <= a.Length invariant forall k :: 0 <= k < i ==> a[k] != key { if (a[i] == key) { clean := false; return; } i := i + 1; } clean := true; } 一次获取键和值。 (还请注意,无需注意const updatedTemplateArr = Object.keys(template).map((key: string) => { const item = template[key]; if (typeof item === 'function') { return { [key]: { filePath: `${projectPath}/${key}`, template: item(param), }, } } }) 参数的类型-TS可以自动推断出它的值)

Object.entries