如何使TypeScript中的非null值防止null赋值?

如何使TypeScript中的非null值防止null赋值?,typescript,Typescript,我理解,nonnull意味着将null和undefined作为类型的有效值删除,但它似乎没有按预期工作 我有以下代码: interface User { name: string; } type NonNullableUser = NonNullable<User>; let user1 : NonNullable<User> = { name: "foo"} let user2 : NonNullable<User> = nu

我理解,
nonnull
意味着将
null
undefined
作为类型的有效值删除,但它似乎没有按预期工作

我有以下代码:

interface User {
    name: string;
}


type NonNullableUser = NonNullable<User>;
let user1 : NonNullable<User> = { name: "foo"}
let user2 : NonNullable<User> = null // expect this to lead to a type error
用户界面{
名称:字符串;
}
类型NonNullableUser=NonNullable;
让user1:nonnull={name:“foo”}
让user2:NonNullable=null//期望这会导致类型错误
我希望
让user2:nonnull=null不编译,但它仍然编译!注意,我设置了
strictNullChecks
为off,因为如果我将其设置为on,编译器会自动阻止
null
赋值,并且
let user2:User=null
将导致编译错误,不再需要工具类型
不可为null

如果我需要为这项工作启用
strictNullChecks
,那么我想知道
NonNullable
是否是多余的

或者我不知道如何使用
不可为空的
?有什么想法吗

注意,我将strictNullChecks设置为off,因为如果我将其设置为on, 编译器会自动防止空赋值,并让user2: User=null将导致编译错误

这是你的问题。在禁用
strictNullChecks
的情况下,
null
undefined
可分配给所有内容。启用该选项后,它们只能分配给显式类型为
null
undefined
的类型。如果可以,通常建议始终启用
strictNullChecks

不再需要不可为null的实用程序类型

事实并非如此。启用
strictNullChecks
后,您仍然可以显式指定类型可为null,并且
NonNullable
将从类型中删除
null
/
未定义的

e、 g

用户界面{
名称:字符串;
}
类型NullableUser=User | null;
const user1:NullableUser=null;
类型NonNullableUser=NonNullable;
常量user2:NonNullableUser=null;//类型错误

因此,如果我得到它,nonnull用于从显式创建的类型中删除
null | undefined
,以使其具有
null | undefined
?听起来对我不是很有用。或者也许我没有足够的想象力来理解这在哪里有用:/I我的意思是为什么不使用
User
NullableUser
类型?这是一个精心设计的示例,只是为了说明它是如何工作的。请记住,并非程序中的所有代码都将由您编写。您可能正在从第三方库导入具有可空类型的代码,并希望将其转换为不可空类型。还是谢谢你。我想我遗漏的部分是理解这只适用于联合类型。现在我需要更多的想象力,所以想想这个场景,这将是有用的:)谢谢!
interface User {
    name: string;
}

type NullableUser = User | null;

const user1: NullableUser = null;

type NonNullableUser = NonNullable<NullableUser>;

const user2: NonNullableUser = null; // Type error