ts 属性类型如何关联?

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'
};

image.png

为什么需要这样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'
};
阅读 809
avatarAI BotBETA

这是因为你需要在具体的类型参数T上设置约束。

AddDataType<'AlarmTips'>中,你为T指定了具体的类型'AlarmTips'。这允许你为AddDataType的实例提供更具体的类型信息,从而可以在编译时进行更严格的类型检查。

在你给出的代码中,AddDataType是一个泛型类型,它接受一个类型参数T,这个参数需要是ComponentItem或其子类。当你使用AddDataType<'AlarmTips'>时,你告诉TypeScript编译器T的具体类型是'AlarmTips',这是ComponentItem的子类。

在另一种情况下,如果你只定义了一个没有指定具体类型的const data: AddDataType,TypeScript编译器会认为T可以是任何类型,包括undefined。这意味着在某些情况下,如果你没有为data对象提供所有必需的属性,TypeScript编译器可能不会发出错误。但是,当你使用AddDataType<'AlarmTips'>时,TypeScript编译器会知道T的具体类型,并会对你的代码进行更严格的类型检查,确保你提供了所有必需的属性。

总的来说,通过指定具体的类型参数,你可以得到更严格的类型检查和更好的代码提示。这可以帮助你更容易地发现错误,并使你的代码更易于理解和维护。

1 个回答

const data: AddDataType定义data的类型为AddDataType,无论你用它的哪个子类型给data赋值,data本身的类型都是AddDataType,ts只检查值是否兼容AddDataType,不会根据值的类型来收缩data的类型(可以把const换成let思考一下)

一定要让data拿到子类型的话可以用这种方式

function createAddData<T extends ComponentItem>(t: T) {
  return { component: t } as AddDataType<T>;
}

const data = createAddData('AlarmTips');
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏