具有以下React组件的接口:
export interface MyInterface {
name: string;
isEasy?: boolean;
isMedium?: boolean;
isHard?: boolean;
}
它必须接受最后三个属性(isEasy、isMedium或isHard)中的最多一个属性
举个例子
<MyComponent name='John' /> // correct
<MyComponent name='John' isEasy /> // correct
<MyComponent name='John' isEasy isHard /> // incorrect
如何才能做到这一点?
试着像这样把他们结合起来,但没有成功:
interface MyInterface {
name: string;
}
interface MyInterfaceEasy extends MyInterface {
isEasy: true;
isMedium?: never;
isHard?: never;
}
interface MyInterfaceMedium extends MyInterface {
isEasy: never;
isMedium?: true;
isHard?: never;
}
interface MyInterfaceHard extends MyInterface {
isEasy: never;
isMedium?: never;
isHard?: true;
}
export type ExportedInterface =
| MyInterfaceEasy
| MyInterfaceMedium
| MyInterfaceHard;
测试时使用:<MyComponent name='John' isEasy />
错误:
Types of property 'isEasy' are incompatible.
Type 'boolean' is not assignable to type 'undefined'
2条答案
按热度按时间mi7gmzs61#
一种方法是总是让其中一个困难是
true
,其余的是?: false
。这样你就可以省略所有的props,或者只保留一个。设置两个困难会将两者都设置为true
,因此它们不会被分配给ExportedInterface
,Typescript会出错。你可以在这里或在Typescript playground中看到一个例子:
你也可以考虑采用一种不同的方法,你有一个 prop 是
difficulty?: 'easy' | 'medium' | 'hard'
。这将只允许一个难度。你可以在这里或在TypescriptPlayground看到这种方法:
nfzehxib2#
我想你可以把你的代码改成:
应该会有用的。