是否可以检索扩展的泛型类型的值,例如string[]?我的用例是判断此"数组"中是否包含给定值:

function isC<C extends string[]>(attribute: string): attribute is C[number] {
  const valueSet: Set<string> = new Set(C)
  return valueSet.has(attribute)
}

推荐答案

当TypeScript被编译成JavaScript时,TypeScript的类型系统是erased,JavaScript是实际运行的.因此,您的函数编译为

function isC(attribute) {
    const valueSet = new Set(C); // <-- this C doesn't exist
    return valueSet.has(attribute);
}

这就是编译器警告您的问题.JavaScript代码中没有C这样的东西.C只是type,并且该类型在运行时不存在.为了使其在运行时有意义,您需要有一个类型为Cvalue.可能是这样:

function isC<C extends string[]>(attributes: [...C], attribute: string): attribute is C[number] {
    const valueSet: Set<string> = new Set(attributes)
    return valueSet.has(attribute)
}

这将起作用:

let attr = Math.random() < 0.5 ? "b" : "d";
if (isC(["a", "b", "c"], attr)) {
    console.log({ a: 1, b: 2, c: 3 }[attr]);
} else {
    console.log("nope");
}

不过,请注意,可能可以调整特定的实现.没有理由需要跟踪实际的数组类型,您只需要元素的字符串literal types.将数组中的所有元素放入Set,然后再执行has()是一种过度杀伤力,因为一旦发现有问题的元素,就可以停止判断array.因此,我建议:

function isC<C extends string>(cArray: C[], attribute: string): attribute is C {
    return (cArray as readonly string[]).includes(attribute);
}

这同样有效.

Playground link to code

Javascript相关问答推荐

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

使用下表中所示的值初始化一个二维数组

Redux查询多个数据库Api reducerPath&

使搜索栏更改语言

Snowflake JavaScript存储过程返回成功,尽管预期失败

我们如何从一个行动中分派行动

v—自动完成不显示 Select 列表中的所有项目

如何根据当前打开的BottomTab Screeb动态加载React组件?

当id匹配时对属性值求和并使用JavaScript返回结果

如何在使用rhandsontable生成表时扩展数字输入验证?

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

自定义图表工具提示以仅显示Y值

无法重定向到Next.js中的动态URL

在D3条形图中对具有相同X值的多条记录进行分组

不同表的条件API端点Reaction-redux

如何在FiRestore中的事务中使用getCountFromServer

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

$GTE的mongoose 问题

检测带有委托的元素内部的点击,以及元素何时按其类名被选中

JS:inline date子串.