type AddDataOtherType<T> = {
component: T; // 组件名称
transition?: 'fade-in-linear' | 'fade-in' | 'zoom-in-center' | 'zoom-in-top' | 'zoom-in-bottom'; // 组件的显隐动画
};
export type AddDataType<T extends ComponentItem = ComponentItem> = (RequiredKeys<
DataType<T>
> extends true
? { data: DataType<T> }
: { data?: DataType<T> }) &
AddDataOtherType<T>;
const data: AddDataType = {
component: 'AlarmTips'
};
const data1: AddDataType<'AlarmTips'> = {
component: 'AlarmTips'
};
为什么需要这样AddDataType<'AlarmTips'>
才能正确获取类型?
不是已经使用 <T>
进行关联了吗?
应该可以通过component: T;
的类型得到AddDataType<T>
接收类型的啊。
测试用例补充:
type DataOtherType<T> = {
component: T; // 组件名称
};
type TL = '1' | '2';
type DataType1<T extends TL = TL> = DataOtherType<T> & (T extends '1' ? { data?: 1 } : { data: 1 });
const data2: DataType1 = {
component: '1'
};
const data3: DataType1 = {
component: '2'
};
const data4: DataType1<'2'> = {
component: '2'
};
const data: AddDataType
定义data
的类型为AddDataType
,无论你用它的哪个子类型给data
赋值,data
本身的类型都是AddDataType
,ts只检查值是否兼容AddDataType
,不会根据值的类型来收缩data
的类型(可以把const换成let思考一下)一定要让data拿到子类型的话可以用这种方式