Typescript从相同的接口道具创建动态联合类型



我想从同一接口的兄弟创建联合类型

象下面这样


interface Foo {
values: string[];
defaultValue: string;
}
function fooo({values, defaultValue}: Foo) {}
fooo({values: ['a', 'b'], defaultValue: 'a'}); // this is correct example
fooo({values: ['a', 'b'], defaultValue: 'c'}); // I want to prevent this case!
// defaultValue must be 'a' or 'b'
// like tuple type 'a' | 'b'

我可以这样做吗?

当然,您可以通过添加泛型类型来实现这一点。

interface Foo<K extends string[]> {
values: [...K];
defaultValue: K[number];
}
function fooo<K extends string[]>({values, defaultValue}: Foo<K>) {}

泛型K将是value数组的元组类型。然后,我们约束defaultValue仅具有K[number]values中指定的值。

让我们看看它是否有效:

fooo({values: ['a', 'b'], defaultValue: 'a'});
fooo({values: ['a', 'b'], defaultValue: 'c'}); // error: Type '"c"' is not assignable to type '"a" | "b"'

游乐场

最新更新