type MessageOf<T> = T["message"];
// Type Error: Type '"message"' cannot be used to index type 'T'.
type MessageOf<T extends { message: unknown }> = T["message"];
type Email = { message: string; }
type Chat = { text: string; }
type EmailMessage = MessageOf<Email>
type Email = MessageOf<Chat> // Type Error
type Example = "A" extends string ? "STRING" : "UNKNOWN"; // "STRING"
// 제너릭에서 사용이 가능합니다.
type MessageOf<T> = T extends { message: unknown } ? T["message"] : never;
interface Email { message: string; }
interface Dog { bark(): void; }
type EmailMessageContents = MessageOf<Email>; // string
type DogMessageContents = MessageOf<Dog>; // never
// 중첩도 가능 합니다.
type TypeOf<T> = T extends string
? 'string'
: T extends number
? 'number'
: T extends boolean
? 'boolean'
: 'unknown'
type StrType = TypeOf<string> // "string"
type StrType = TypeOf<number> // "string"
type StrType = TypeOf<Function> // "unknown"
const userList = [{ name: 'John' }] // type: Array<User>
type ItemOf<T> = T extends Array<infer U> ? U : unknown;
type User = ItemOf<typeof userList>; // User { name: string }