如何一般地约束参数成为元组的成员?

问题描述

从带有命名元组的Typescript 4.0开始,我想知道是否有可能实现以下目的:

declare const foo: <T extends string[],U extends memberOf T>(xs: T,x: U) => void

declare const ALL_OPTIONS: ['Alice','Bob']


foo(ALL_OPTIONS,'Carl')  // Error
foo(ALL_OPTIONS,'Alice') // No Error

基本上,我试图将U约束到元组的某个元素,如果存在memberOf,可能会以与keyOf相同的方式存在T一个对象。

解决方法

您可以使用U extends T[number],如下所示:

declare const foo: <T extends string[],U extends T[number]>(xs: T,x: U) => void

declare const ALL_OPTIONS: ['Alice','Bob']


foo(ALL_OPTIONS,'Carl')  // Error
foo(ALL_OPTIONS,'Alice') // No Error

Playground link

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...