Typescript strictNullChecks 不会缩小类型
Typescript strictNullChecks does not narrow type
我有一个简单的案例,即使我明确检查未定义,strictNullChecks
也没有缩小类型。
interface WideType {
one: { two: number } | undefined;
}
interface NarrowType {
one: { two: number };
}
const example = (value: WideType): NarrowType | null => {
if (value.one) {
return value; // I have an error here
}
return null;
};
错误信息是:
Type 'WideType' is not assignable to type 'NarrowType'.
Types of property 'one' are incompatible.
Type '{ two: number; } | undefined' is not assignable to type '{ two: number; }'.
Type 'undefined' is not assignable to type '{ two: number; }'.ts(2322)
我如何帮助 TS 编译器解决这个问题?
TS 版本 3.7.2
类型保护只对一个类型起作用,对属性不起作用,这意味着:
interface WideType {
one: { two: number } | undefined;
}
interface NarrowType {
one: { two: number };
}
const example = (value: WideType): NarrowType | null => {
if (value.one) {
// return value; // You have an error here, as value.one is not undefined, but value is still a WideType
return {one: value.one}; // This works as value.one is not undefined
}
return null;
};
为了适当缩小类型,您可以在表单中创建自定义类型保护:
const isNarrow = (a: WideType): a is NarrowType => !!a.one;
在你的例子中使用:
interface WideType {
one: { two: number } | undefined;
}
interface NarrowType {
one: { two: number };
}
const isNarrow = (a: WideType): a is NarrowType => !!a.one;
const example = (value: WideType): NarrowType | null => {
if (isNarrow(value)) {
return value; // value is NarrowType
}
return null;
};
我有一个简单的案例,即使我明确检查未定义,strictNullChecks
也没有缩小类型。
interface WideType {
one: { two: number } | undefined;
}
interface NarrowType {
one: { two: number };
}
const example = (value: WideType): NarrowType | null => {
if (value.one) {
return value; // I have an error here
}
return null;
};
错误信息是:
Type 'WideType' is not assignable to type 'NarrowType'.
Types of property 'one' are incompatible.
Type '{ two: number; } | undefined' is not assignable to type '{ two: number; }'.
Type 'undefined' is not assignable to type '{ two: number; }'.ts(2322)
我如何帮助 TS 编译器解决这个问题? TS 版本 3.7.2
类型保护只对一个类型起作用,对属性不起作用,这意味着:
interface WideType {
one: { two: number } | undefined;
}
interface NarrowType {
one: { two: number };
}
const example = (value: WideType): NarrowType | null => {
if (value.one) {
// return value; // You have an error here, as value.one is not undefined, but value is still a WideType
return {one: value.one}; // This works as value.one is not undefined
}
return null;
};
为了适当缩小类型,您可以在表单中创建自定义类型保护:
const isNarrow = (a: WideType): a is NarrowType => !!a.one;
在你的例子中使用:
interface WideType {
one: { two: number } | undefined;
}
interface NarrowType {
one: { two: number };
}
const isNarrow = (a: WideType): a is NarrowType => !!a.one;
const example = (value: WideType): NarrowType | null => {
if (isNarrow(value)) {
return value; // value is NarrowType
}
return null;
};