【问题标题】:Why does it type check?为什么要进行类型检查?
【发布时间】:2020-01-24 10:54:28
【问题描述】:

这个对我来说没有意义:

import axios from 'axios'
import * as TE from 'fp-ts/lib/TaskEither'

export const getIntent = (sessionId: string, input: string) => process.env.INTENT_URL
  ? TE.tryCatch(
      () => axios.post(`${process.env.INTENT_URL}`,{sessionId, input}),
      reason => String(reason))
  : TE.left(Error("No INTENT_URL")
)

LeftString 和/或 Error,这显然不相等。这种类型怎么检查???

【问题讨论】:

    标签: typescript typescript-typings typechecking fp-ts


    【解决方案1】:

    这种类型检查的原因相同:

    export const getIntent = () => process.env.INTENT_URL
      ? true
      : "false"
    

    您的函数上没有返回类型注释,因此 typescript 会自动将返回类型扩展为联合类型以覆盖返回值。

    【讨论】:

    • 你不觉得这感觉不对吗?我从来没有说过我想扩大返回类型。
    • 不知道。我承认,这看起来有点奇怪,但实际上我个人从来没有遇到过任何问题。通常,在顶级函数上始终具有完整的类型注释是一个好习惯。甚至还有一个 eslint 规则来执行它。
    • 也许严格的编译器选项之一会禁用这种行为?不确定。
    • 如果我想要 sum 类型,我明确指定 Either。如果我想要一个产品类型,我会明确指定Tuple
    • 在顶层您应该指定类型,这样就不会出现问题。但是您可能会编写 lambda 函数并且不指定类型。你举的例子很简单。在实践中,你会有变量,可能会写错而你没有注意到!
    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多