我有一个Logger类,它可以在构造函数中接收默认的可选值:
interface Log {
level: string
scope: string
source: string
message: string
}
type LogDefaults = Partial<Log>
type LogInput = Log
class Logger {
constructor(private defaults: LogDefaults = {}) {}
public log(log: LogInput): void {
console.log({ ...this.defaults, ...log })
}
}
我希望用户在构造函数中作为“默认值”传递的属性在log方法中是可选的。
有没有一种方法可以定义“LogInput”类型,以便在运行时只需要“LogDefaults”中没有提供的属性?
这应该可以工作:
const logger = new Logger()
logger.log({
scope: 'my-scope',
source: 'my-souce',
level: 'info',
message: 'my message'
})
这也应该起作用:
const logger = new Logger({ scope: 'my-scope', source: 'my-souce' })
logger.log({
level: 'info',
message: 'my message'
})
这不应该工作(缺少必需的“source”属性):
const logger = new Logger({ scope: 'my-scope' })
logger.log({
level: 'info',
message: 'my message'
})
1条答案
按热度按时间m3eecexj1#
可以使用generics解决。Playground链接
编辑:根据@Axnyff的建议更新