【问题标题】:How can I get this Typescript typeguard to work in a generic-type context?如何让这个 Typescript 类型保护在泛型类型上下文中工作?
【发布时间】:2017-02-10 14:59:36
【问题描述】:

下面v2的初始化给出:Type 'T[keyof T]' cannot be converted to type 'number'.出了什么问题?

private func<T extends Object>(o:T, prop: keyof(T)): void {
    const val = o[prop]
    if ( typeof val === 'number' ) {
        const v2: number = val as number
    }
}

这在非通用上下文中有效,如下 [UPDATE],但这作为解决方法没有用,因为调用者只能使用 Object 本身的属性。

private func2(o:Object, prop: keyof(Object)): void {
    const val = o[prop]
    if ( typeof val === 'number' ) {
        const v2: number = val as number
    }
}

这是我提取出来的一个愚蠢的例子,专注于这个问题;如果真实的上下文有帮助,请告诉我。

【问题讨论】:

  • 你必须把它转换成一个数字吗?类型不是推断出来的吗?
  • @MuratK。如果我不投,也会出现同样的错误(措辞略有不同)。我包括演员,因为如果我没有,我会得到我应该尝试的 cmets! ;-)
  • 如果有更多专家可以解释为什么 typeguard 在这种情况下不起作用,我将不胜感激。我想知道是否要在上面写一个问题(错误报告)。

标签: generics typescript


【解决方案1】:

我是打字稿的新手,但我似乎必须按照here的建议进行双重转换@

  private func1<T extends Object>(o:T, prop: keyof(T)): void {
    const val = o[prop]
    if ( typeof val === 'number' ) {
        const v2: number = val as any as number
    }

除了你可以这样使用它吗?我至少在文档上读过它。 Section Index Types

private func<T extends Object, K extends keyof T>(o: T, prop: K): void {
    const val = o[prop]
    if (typeof val === 'number') {
        const v2 = val as any as number
    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2021-06-01
    • 2020-09-03
    • 2019-05-30
    • 2021-12-06
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多