如何将值设置为继承类型的可选属性

时间:2018-07-07 12:07:50

标签: typescript

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; }'.

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

问题是createCGI的编写方式将检查TCgiConfigMap兼容,但随后它将返回您传递的对象文字的确切类型,其中不包含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)