TypeScript-----------------------------高阶知识点条件类型
·
//条件类型 ,是根据条件,生成新的类型
interface myAnimal
{
breach:() => {}
}
interface myDog extends myAnimal
{
bark:() => {}
}
interface myTank
{
pH:number
}
type Example = myDog extends myAnimal ? string:number;
//使用条件类型的例子 , 可以让我们的函数重载的语法更简练
interface IdLabel{
id:number;
}
interface NameLabel
{
name:string;
}
// function createLabel(key:string):NameLabel;
// function createLabel(key:number):IdLabel;
// function createLabel(key:string|number):IdLabel|NameLabel
// {
// if(typeof key === 'string')
// {
// return {name : key};
// }
// return {id : key};
// }
// const label = createLabel('dell');
type IdOrNameLabel<T> = T extends number ? IdLabel:NameLabel;
function createLabel<T extends string|number>(key:T):IdOrNameLabel<T>;
function createLabel(key:string|number):IdLabel|NameLabel
{
if(typeof key === 'string')
{
return {name : key};
}
return {id : key};
}
const label_s = createLabel('dell');
const label_n = createLabel(123);
//条件类型其他的应用场景
type TypeOfMessage<T> = T extends {message:unknown} ? T['message']:never;
interface m_Email
{
from:string;
to:string;
message:string;
}
//type EmailMessage = string;
const emailObject:m_Email = {
from:'dell@qq.com',
to:'lee@qq.com',
message:'hello lee'
}
//const email:EmailMessage = 'dell@qq.com';
const email:TypeOfMessage<m_Email> = 'dell@qq.com';
// type Message1 = TypeOfMessage<{message:string}>;
// type Message2 = TypeOfMessage<string>;
//条件类型其他使用场景
//判断函数返回值类型
type GetRetureType<T> = T extends (...args:never[]) => infer RetureType ? RetureType:never;
type example1 = GetRetureType<() => string>;//string
type example2 = GetRetureType<string>;//never
//条件类型其他使用场景
type ToArray<Type> = Type extends any ? Type[]:never;
type stringArray = ToArray<string>;//string[]
type NeverType = ToArray<never>;//never
type stringOrArray = ToArray<string|number>;//string[]|number[]
//变
type m_ToArray<Type> = [Type] extends [any] ? Type[]:never;
更多推荐

所有评论(0)