//条件类型 ,是根据条件,生成新的类型
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;

更多推荐