我想从同一接口的兄弟创建联合类型
象下面这样
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"'
游乐场