打字稿接口变量空检查并设置默认值

Posted

技术标签:

【中文标题】打字稿接口变量空检查并设置默认值【英文标题】:typescript interface variable null check and set default value 【发布时间】:2021-02-17 21:56:18 【问题描述】:

如何在接口变量上检查 null 以及如何在 typescript 中设置默认值?

const userModel = snap.data() as UserModel //firestore

export interface UserModel 
    docId: string, 
    accountId: number // if null then I want to set 0

有时,用户没有帐户 ID。那么如何检查呢?

if (userModel.userPushToken !== undefined) - 目前我正在这样检查

【问题讨论】:

【参考方案1】:

接口中的初始化程序

在 Typescript 中,接口只是对对象外观的描述,不能包含任何功能。因此,您不必像使用类那样构建接口。因此,您无法在界面中进行任何初始化。 如果您将 typescript 接口编译为 javascript,typescript 编译器只会删除它,因为它除了使内容更具可读性并提供类型检查之外没有其他功能。 如果您想初始化一个变量,我建议您将接口更改为一个类:

export class MyUserModel implements UserModel
    public docId: string;
    public accountId: number

    constructor(usrmodel:UserModel)
        this.docId = usrmodel.docId || ""; // Initialize with "" if docId is null or undefined
        this.accountId = usrmodel.accountId || 0; // Initialize with 0 if accountid is null or undefined
    

或者为接口写一个“复制构造器”:

function InitUserModel(usrModel:UserModel):UserModel
    usrModel.accountId = usrModel.accountId || 0;
    return usrModel;

检查是否为空或未定义

有很多关于这个的好帖子。例如Is there a way to check for both `null` and `undefined`?

【讨论】:

【参考方案2】:

Typescript 只是类型。

所以,你不能设置默认值。

但是,你可以设置默认类型。

export interface UserModel<T> 
    docId: string, 
    accountId: T extends number ? number : 0 // if null then I want to set 0



const snap: any = 

const userModel = snap.data() as UserModel<void> //firestore

userModel.accountId = 0 // if assign not 0, error occured.

您可以在函数中设置默认值。

但是,它是 javascript 而不是打字稿。

type Params = 
    a: number,
    b: string


const foo = ( a=1, b='something': Params ) => 
    console.log(params);

【讨论】:

如何处理null? 您可以在javascript中设置默认值!打字稿不在运行时执行。

以上是关于打字稿接口变量空检查并设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

具有默认参数值的打字稿条件返回类型

使用默认值键入对象参数

使用键值管道进行打字稿类型检查

如何故意在打字稿中定义一个“空接口”

打字稿模型到json - 忽略空值属性

类型转换时的打字稿默认属性