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'
A TypeScript playground demo here
CGI.bindCardPreCheck.b = 'xxx'
此行出现错误:Property 'b' does not exist on type '{ a: string; }'.
如何解决此问题?
答案 0 :(得分:1)
问题是createCGI
的编写方式将检查T
与CgiConfigMap
兼容,但随后它将返回您传递的对象文字的确切类型,其中不包含b
。您可以直接返回CgiConfigMap
,但随后会丢失对象文字的属性名称,这很不幸。
一个更好的解决方案是返回一个映射类型,该类型保留第一级的对象文字属性,但使所有这些属性的类型为CgiConfig
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
答案 1 :(得分:0)
const CGI = createCGI<CgiConfigMap>({
bindCardPreCheck: {
a: ''
}
})
或
const CGI = createCGI({
bindCardPreCheck: {
a: ''
}
} as CgiConfigMap)