Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何将值设置为继承类型的可选属性 导出接口CgiConfig{ a:弦, b:字符串 } 导出接口CgiConfigMap{ [cgiName:string]:CgiConfig } 常量createCGI=(cgi:T)=>cgi const CGI=createCGI({ bindCardPreCheck:{ a:“” } }) CGI.bindCardPreCheck.b='xxx'_Typescript - Fatal编程技术网

Typescript 如何将值设置为继承类型的可选属性 导出接口CgiConfig{ a:弦, b:字符串 } 导出接口CgiConfigMap{ [cgiName:string]:CgiConfig } 常量createCGI=(cgi:T)=>cgi const CGI=createCGI({ bindCardPreCheck:{ a:“” } }) CGI.bindCardPreCheck.b='xxx'

Typescript 如何将值设置为继承类型的可选属性 导出接口CgiConfig{ a:弦, b:字符串 } 导出接口CgiConfigMap{ [cgiName:string]:CgiConfig } 常量createCGI=(cgi:T)=>cgi const CGI=createCGI({ bindCardPreCheck:{ a:“” } }) CGI.bindCardPreCheck.b='xxx',typescript,Typescript,CGI.bindCardPreCheck.b='xxx'此行出现错误:类型“{a:string;}”上不存在属性“b”。 如何解决此问题?问题在于编写createCGI的方式,它将检查T是否与cgionfigmap兼容,但随后将返回您传递的对象文本的确切类型,其中不包含b。您可以直接返回CgiConfigMap,但随后会丢失对象文本的属性名称,这将是不幸的 export interface CgiConfig { a: string, b?: string } export in

CGI.bindCardPreCheck.b='xxx'
此行出现错误:
类型“{a:string;}”上不存在属性“b”。


如何解决此问题?

问题在于编写
createCGI
的方式,它将检查
T
是否与
cgionfigmap
兼容,但随后将返回您传递的对象文本的确切类型,其中不包含
b
。您可以直接返回
CgiConfigMap
,但随后会丢失对象文本的属性名称,这将是不幸的

export interface CgiConfig {
    a: string,
    b?: string
}
export interface CgiConfigMap {
   [cgiName: string]: CgiConfig
}
const createCGI = <T extends CgiConfigMap>(cgi: T) => cgi
const CGI = createCGI({
    bindCardPreCheck: {
        a: ''
    }
})

CGI.bindCardPreCheck.b = 'xxx'
更好的解决方案是返回一个映射类型,该类型保留第一级的对象文字属性,但使所有这些属性都成为
CgiConfig

const CGI = createCGI({
  bindCardPreCheck: {
    a: ''
  }
} as CgiConfigMap)
导出接口CgiConfig{
a:弦,
b:字符串
}
导出接口CgiConfigMap{
[cgiName:string]:CgiConfig
}
const createCGI=(cgi:T):{[P in keyof T]:CgiConfig}=>cgi
const CGI=createCGI({
bindCardPreCheck:{
a:“”
}
})
CGI.bindCardPreCheck.b='xxx'//现在可以了

在这个特定的示例中,您可以摆脱泛型,并且可以很好地使用
constcreatecgi=(cgi:cgionfigmap)=>cgi@AlekseyL。起初,我也像你说的那样编写代码,但是在使用
CGI时,IDE不会显示
bindCardPreCheck
属性,以便我自动完成代码。感谢你提供的这个代码片段,它可能会提供一些有限的、即时的帮助。A通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。
const CGI = createCGI({
  bindCardPreCheck: {
    a: ''
  }
} as CgiConfigMap)
export interface CgiConfig {
    a: string,
    b?: string
}
export interface CgiConfigMap {
    [cgiName: string]: CgiConfig
}
const createCGI = <T extends CgiConfigMap>(cgi: T) : { [P in keyof T]: CgiConfig } => cgi
const CGI = createCGI({
    bindCardPreCheck: {
        a: ''
    }
})

CGI.bindCardPreCheck.b = 'xxx' //ok now