可以根据打字稿推断出路口类型

时间:2019-08-29 17:38:56

标签: typescript intersection typescript-types

我有这个代码。

interface Test {
  field1: string;
  field2: string;
}
interface Test2 {
  field3: string;
}

type TestResult = Partial<Test> & Test2;

const a = ():TestResult => {
  return {};
}

这正常工作,我的意思是,如果我在obj中没有field3,它不会让我编译,但是我无法得到TestResult上所有字段的推论,只有“ Partial&Test2”。 我的意思是,如何实现智能感知,而不是显示它显示的“ Partial&Test2”

field1: string;
field2: string;
field3: string;

这将是TestResult的实际结果

提前谢谢

1 个答案:

答案 0 :(得分:1)

无法保证将在工具提示中扩展类型别名。但是,有一个技巧可以用于多个版本:

interface Test {
  field1: string;
  field2: string;
}
interface Test2 {
  field3: string;
}

type Id<T> = {} & { [P in keyof T]: T[P] }
type TestResult = Id<Partial<Test> & Test2>;

const a = ():TestResult => {
  return {};
}

Id类型将强制打字稿扩展类型别名并为您提供所需的工具提示(尽管对于大型类型,这实际上会适得其反,并使工具提示难以阅读)

type TestResult = {
    field1?: string | undefined;
    field2?: string | undefined;
    field3: string;
}

您还可以实现相反的操作,即通过使用接口来维护名称而不是扩展类型:

interface Test {
  field1: string;
  field2: string;
}
interface Test2 {
  field3: string;
}

type Id<T> = {} & { [P in keyof T]: T[P] }
interface TestResult extends Id<Partial<Test> & Test2> {}

const a = ():TestResult => {
  return {};
}

这对于希望使用稳定名称而不是让ts扩展其所需类型的大型别名是非常有用的。