typescript 如何在设置变量时强制执行严格的类型化?

2ic8powd  于 2023-03-04  发布在  TypeScript
关注(0)|答案(2)|浏览(200)

我希望确保从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文件将有不同的结构)。
我希望通过强制confHttp[],只有具有此结构的数据才能被接受。
但这不是真的,通过发送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'
  }
]

为什么wazaaHttp中不存在,但程序却能正常运行?或者,更具体地说:如何在初始化或更新变量时强制执行严格的类型检查?

r1zhe5dt

r1zhe5dt1#

可以使用zod库进行运行时验证。
您需要使用与Typescript稍有不同的语言定义一个模式,然后您将自动获得一个Typescript类型和一个函数,用于根据该模式解析任意值。

qaxu7uf2

qaxu7uf22#

如果没有模式,yaml.load就不知道它应该读什么,所以它会解析并返回任何有效的yaml。TS中的类型强制不会验证任何东西,相反,它只是告诉编译器知道类型是什么。
更重要的是,如果您想确保输入具有给定的结构和类型,您要么需要自己验证数据,要么使用一个为您验证数据的库。

相关问题