我希望确保从YAML文件中读取的数据与它所进入的变量的类型一致:
type Http = {
name: string
api: string
resp: number
status: string
statusEffective: string
}
export const monitorHttp = () => {
const conf = getConf("conf-http.yml") as Http[]
log.info("", conf)
}
getConf
定义为
export const getConf = (file: string) => {
try {
return yaml.load(fs.readFileSync(`../data/${file}`, "utf8"))
} catch {
log.error("cannot load config.yaml, aborting")
process.exit(1)
}
}
因此getConf
返回的是any
类型,不同的.yml
文件将有不同的结构)。
我希望通过强制conf
为Http[]
,只有具有此结构的数据才能被接受。
但这不是真的,通过发送Http
中不存在的字段,程序仍然可以正常运行。
- name: jellyfin
api: http://jellyfin.xxxx
resp: 200
status: enabled
wazaa: wazii
我得到了结果
2023-02-26 17:55:49.979 INFO \W\dev-perso\hass-monitoring\src\monitor-http.ts:14 [
{
name: 'jellyfin',
api: 'http://jellyfin.xxxx',
resp: 200,
status: 'enabled',
wazaa: 'wazii'
}
]
为什么wazaa
在Http
中不存在,但程序却能正常运行?或者,更具体地说:如何在初始化或更新变量时强制执行严格的类型检查?
2条答案
按热度按时间r1zhe5dt1#
可以使用zod库进行运行时验证。
您需要使用与Typescript稍有不同的语言定义一个模式,然后您将自动获得一个Typescript类型和一个函数,用于根据该模式解析任意值。
qaxu7uf22#
如果没有模式,
yaml.load
就不知道它应该读什么,所以它会解析并返回任何有效的yaml。TS中的类型强制不会验证任何东西,相反,它只是告诉编译器你知道类型是什么。更重要的是,如果您想确保输入具有给定的结构和类型,您要么需要自己验证数据,要么使用一个为您验证数据的库。