繁体   English   中英

使用条件值定义typescript接口

[英]Define typescript interface with conditional values

假设我想创建一个如下所示的界面:

interface DataStatus<T> {
   isSuccess: boolean; 
   isError: boolean;
   data: T | undefined; 
}

后来我将使用它:

interface Foo {
   id: string; 
   name: string; 
}

function fetchData() : DataStatus<Foo> {
   //implementation
}


const ds = fetchData(); 

if (ds.isSuccess) {
   console.log(ds.data.name); //TS Warning - ds.data might be undefined
}

我想做的是使用这些规则为DataStatus接口添加一些条件:

  • isSuccessisError必须是对立的
  • data有一定的价值T如果isSuccess是真实的,并undefined如果isSuccess是假的

打字稿有可能吗?

是的,如果你有一个有区别的联盟,你可以。

interface ISuccessDataStatus<T> {
   isSuccess: true; 
   isError: false;
   data: T; 
}

interface IFailureDataStatus<T> {
   isSuccess: false; 
   isError: true;
   data: undefined; 
}


type PossibleStatus<T> = ISuccessDataStatus<T> | IFailureDataStatus<T>;


declare const hello: PossibleStatus<{ name: "john" }>

if (hello.isSuccess) {
    const whatType = hello.data; // T and not T | undefined
}

const whatType = hello; // PossibleDataStatus; (outside the if block)

Typescript很聪明,可以弄清楚何时hello.isSuccess在该块内是真的,它知道它是真的,它会将hello的类型缩小到ISucessDataStatus而不是union。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM