打字稿:使用类型断言后验证类型

时间:2018-04-30 20:49:17

标签: typescript

有没有办法在使用类型断言后允许对值进行严格类型检查?

例如,有时我需要构造一个具有属性的函数类型:

type FuncPlus = {
    (): void;
    anAttr: number;
    anotherAttr: Array<number>;
};

const f = (() => { }) as FuncPlus;
f.anAttr = 1;

f.anotherAttr.length # will error because `anotherAttr` is `undefined`

我想要一种干净的构造方式,仍然可以提供真正的类型安全。

这是我发现的最接近的,但它不是“打字稿-y”:

const f: FuncPlus = Object.assign(
    () => { },
    {
        anAttr: 1,
        // without `anotherAttr` defined here, 
        // typescript will throw a compilation error, as desired
    }
)

有没有人知道另一种方式?

2 个答案:

答案 0 :(得分:0)

type FuncPlus = {
  (): void;
  anAttr: undefined | number;
  anotherAttr: undefined | Array<number>;
};

满足你的条件?

const f = (() => {}) as FuncPlus;

f.anAttr = 1;
f.anAttr.toFixed() // good because of the above assignment

f.anotherAttr = "a" // errors - "a" is not assignable to type
f.anotherAttr.length // still errors // f.anotherAttr may be undefined

f.anotherAttr = []
f.anotherAttr.length // good

答案 1 :(得分:0)

Object.assign是应该分配FuncPlus类型的方式,它已经足够简洁了。

如果有一小组属性,可以使用辅助函数来跳过属性名称:

const getFuncPlus = (fn: () => void, anAttr: number, anotherAttr: number[]): FuncPlus =>
 Object.assign(fn, { anAttr, anotherAttr });

getFuncPlus(() => {}, 1) // causes an error