有没有办法在使用类型断言后允许对值进行严格类型检查?
例如,有时我需要构造一个具有属性的函数类型:
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
}
)
有没有人知道另一种方式?
答案 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