我正在尝试从一个对象创建模板文件,该对象的键可以是字符串,也可以是返回字符串的函数:
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)'是可调用的。 类型“字符串”没有呼叫签名。
我在做什么错了?
答案 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