Typealias — ano ito, syntax at aplikasyon sa Kotlin

May-akda: IT Sectr Nai-publish: 2026-06-23 Oras ng pagbabasa: 7 min

Ang typealias ay isang mekanismo ng Kotlin para sa paglikha ng alternatibong pangalan ng isang umiiral na uri. Ang keyword na typealias ay nagpapahintulot na palitan ang isang kumplikadong deklarasyon ng uri ng isang maikli at naiintindihang alias, nang hindi lumilikha ng bagong uri. Ayon sa dokumentasyon ng Kotlin (2026), pinapabuti ng typealias ang pagiging madaling mabasa ng code, lalo na sa mga lagda ng function na may mga functional na uri. Typealias ginagawang self-documenting ang code, pinapalitan ang mga verbose na deklarasyon ng mga naiintindihang pinangalanang uri.

Mga pangunahing punto

  • Typealias — alias para sa umiiral na uri, hindi lumilikha ng bagong uri
  • Mga functional na uri — pinapalitan ng typealias ang kumplikadong (T) -> R ng mga nababasang pangalan tulad ng Callback
  • Mga generics — sinusuportahan ng typealias ang mga generic na parameter: typealias ListMapper = (T) -> T
  • Mga nested class — pinapaikli ng typealias ang pag-access sa mga nested class mula sa iba pang mga package
  • Kaligtasan ng uri — hindi nagdaragdag ng mga pagsusuri ang typealias sa yugto ng compilation, ang alias ay ganap na napagpapalit ng orihinal

Ano ang typealias?

Typealias (alias ng uri) — isang deklarasyon na nagpapakilala ng alternatibong pangalan para sa isang umiiral na uri. Syntax: typealias BagongPangalan = UmiiralNaUri. Pagkatapos ng deklarasyon, ang BagongPangalan ay maaaring gamitin kahit saan kung saan inaasahan ang UmiiralNaUri — itinuturing sila ng compiler bilang parehong uri. Sa antas ng bytecode, ang typealias ay hindi nag-iiwan ng bakas: lahat ng impormasyon tungkol sa alias ay binubura sa yugto ng compilation.

Ang pangunahing layunin ng typealias ay pagpapabuti ng pagiging madaling mabasa ng code. Sa halip na isang mahabang lagda fun process(callback: (Result) -> Unit) maaaring sumulat ng typealias Callback = (Result) -> Unit at gamitin ang Callback bilang uri ng parameter. Ito ay lalong kapaki-pakinabang kapag ang parehong functional na uri ay umuulit sa maraming lugar sa code: ang alias ay nagsisilbing nag-iisang punto ng kahulugan at nagdodokumento ng layunin ng uri.

Ang typealias ay hindi lumilikha ng bagong uri — ito ay isang kasingkahulugan lamang. Ang mga variable ng uri Callback at (Result) -> Unit ay ganap na napagpapalit. Hindi magbibigay ng error ang compiler kung ang isang lambda ay direktang ipapasa sa isang function na umaasa ng Callback. Ito ang nagpapakilala sa typealias mula sa inline class (value class), na lumilikha ng bagong uri-ng-pambalot na may pagsusuri sa yugto ng compilation. Ang typealias ay pagpapalit ng pangalan, hindi pambalot.

Typealias para sa mga functional na uri

Ang pinakakaraniwang senaryo ng paggamit ng typealias sa Kotlin ay mga functional na uri. Ang mahahabang lagda tulad ng (Int, String) -> Boolean o (List) -> Result ay nagpapahirap sa pagbasa ng code. Ginagawang maikli at makabuluhang pangalan ng typealias ang mga ito na nagdodokumento ng layunin ng function: typealias Validator = (String) -> Boolean ay tumutukoy na ito ay isang validator ng string.

kotlin
// Walang typealias
fun findUsers(
    filter: (List<User>) -> List<User>
): List<User>

// May typealias
typealias UserFilter = (List<User>) -> List<User>

fun findUsers(filter: UserFilter): List<User>

// Paggamit sa klase
typealias OnClickListener = (View) -> Unit

class Button {
    var onClick: OnClickListener = {}
}

Sa halimbawa, ang typealias UserFilter ay nagtatago ng kumplikadong functional na uri (List) -> List sa likod ng isang maikling pangalan. Ang lagda ng findUsers ay nagiging nababasa: «tumanggap ng UserFilter, nagbabalik ng List». Ang typealias OnClickListener ay ginagawang katulad ng deklarasyon ng interface ang code, ngunit walang overhead ng paglikha ng isang hiwalay na interface o abstract na klase. Ang mga lambda at anonymous na function ay patuloy na gumagana gaya ng dati — ang typealias ay hindi nangangailangan ng mga pagbabago sa tumatawag na code.

Typealias na may generics

Typealias ay sumusuporta sa mga generic na parameter, na ginagawang mas flexible. Maaaring tukuyin ang typealias Mapper = (T) -> R at gamitin sa anumang uri. Pinapalitan ng compiler ang mga konkreto na uri sa lugar ng mga parameter sa bawat paggamit ng alias, na pinapanatili ang buong kaligtasan ng uri.

kotlin
// Generic na typealias
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>

fun processNumbers(mapper: Mapper<Int, String>) {
    // uri ng mapper ay (Int) -> String
}

fun main() {
    val config: Provider<String> = { "default config" }
    val reverse: ListTransformer<Int> = { it.reversed() }
}

Sa listing, Mapper — isang generic na alias para sa anumang pagbabago mula T patungong R. Provider — tagapagbigay ng halaga (pabrika na walang argumento). ListTransformer — function ng pagbabago ng listahan. Sa tawag na processNumbers(mapper: Mapper) binuksan ng compiler ang alias sa (Int) -> String. Ginagawa ng generics ang typealias na isang unibersal na kasangkapan na angkop para sa anumang konteksto nang walang pagdodoble ng mga deklarasyon.

Typealias para sa mga nested class at mahabang pangalan

Mga nested class at mahabang naka-parameter na uri — isa pang lugar kung saan ang typealias ay nagpapasimple ng code. Kung ang isang klase ay nasa malalim na bahagi ng hierarchy ng nesting (Outer.Inner.Nested), ang pagtukoy dito sa pamamagitan ng buong pangalan ay nagpapagulo sa code. Pinapaikli ng typealias ang pag-access na ito at ginagawa itong mas nababasa. Ito ay lalong mahalaga para sa mga klase mula sa mga third-party na library na may mahabang pangalan.

kotlin
// Alias para sa nested class
class NetworkResponse {
    class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error

// Alias para sa mahabang uri ng library
typealias UserId = Long
typealias JsonMap = Map<String, Any?>

fun process(error: NetworkError) {
    println("${error.code}: ${error.message}")
}

fun parseJson(data: JsonMap): UserId {
    return data["id"] as? Long ?: 0L
}

Sa halimbawa, NetworkError — alias para sa nested class na NetworkResponse.Error. Sa pag-import ng typealias, ang NetworkError ay maaaring gamitin bilang isang ordinaryong uri, nang hindi isinisiwalat ang hierarchy ng nesting. JsonMap ay nagdodokumento na ang mapa ay kumakatawan sa isang JSON object. UserId ay nagpapaliwanag ng layunin ng Long sa partikular na konteksto — ang mambabasa ay agad na nauunawaan na ito ay isang identifier ng user, hindi isang arbitrary na numero. Gayunpaman, hindi pinoprotektahan ng typealias laban sa pagpasa ng ordinaryong Long kung saan inaasahan ang UserId — para diyan kailangan ang value class.

Typealias vs inline class: mga pagkakaiba

Typealias at inline class (value class) ay lumulutas ng iba't ibang gawain, kahit na pareho silang nagpapakilala ng bagong pangalan para sa isang uri. Ang typealias ay isang kasingkahulugan lamang: ang variable ng uri UserId = Long ay tumatanggap ng anumang Long nang walang pagsusuri. Ang inline class ay bumabalot ng halaga sa isang bagong uri na sinusuri sa yugto ng compilation: ang pagpasa ng ordinaryong Long kung saan inaasahan ang inline class UserId ay imposible nang walang tahasang conversion.

KatangianTypealiasInline class
Bagong uriHindi — kasingkahulugan ng orihinalOo — bagong uri na may mga pagsusuri
PagganapWala — ganap na nabuburaWala — pambalot ay tinatanggal sa bytecode
PamanaHindiHindi (final class)
Sariling pamamaraanHindiOo — maaaring magdeklara ng mga function
Kaligtasan ng uriHindi — napagpapalit ng orihinalOo — pinag-iiba ng compiler ang mga uri

Ipinapakita ng talahanayan ang pagkakaiba sa pagitan ng dalawang mekanismo. Typealias ay angkop para sa maiikling pangalan at dokumentasyon ng code kapag hindi kinakailangan ang mahigpit na pag-type. Ang inline class sa pamamagitan ng keyword na value class (dating inline class) ay kinakailangan kapag mahalagang pag-ibahin ang mga semantikong magkaibang halaga ng parehong primitive na uri. Halimbawa, ang UserId at OrderId ay parehong Long, ngunit ang pagpasa ng isa kung saan inaasahan ang isa ay isang lohikal na error na pinipigilan ng value class sa yugto ng compilation.

Mga madalas itanong

Paano naiiba ang typealias sa import alias?

Import alias (import com.example.LongName as Short) ay gumagana sa antas ng import — pinapaikli ang pangalan lamang sa kasalukuyang file. Ang typealias ay nagdedeklara ng isang global na alias na magagamit sa buong proyekto pagkatapos ng import.

Maaari bang gamitin ang typealias para sa paglikha ng recursive na uri?

Oo, typealias ay sumusuporta sa recursive na mga kahulugan para sa functional na mga uri, ngunit may pag-iingat: typealias Rec = (T) -> Rec ay gumagana, ngunit ang recursive na mga sanggunian sa object — hindi. Sinusuri ng compiler ang mga cycle at nagbibigay ng error para sa walang katapusang mga kahulugan.

Nakakaapekto ba ang typealias sa pagganap?

Hindi, ang typealias ay ganap na nabubura sa yugto ng compilation. Sa bytecode at runtime, ginagamit ang orihinal na uri nang walang anumang pambalot. Ang pagganap ay kapareho ng direktang paggamit ng orihinal na uri.

Ano ang maximum na antas ng nesting para sa typealias?

Typealias ay maaaring tumukoy sa isa pang typealias — ito ay tinatawag na chain ng mga alias. Ang lalim ng chain ay pormal na hindi limitado, ngunit para sa pagiging madaling mabasa inirerekomenda ang hindi hihigit sa 2–3 antas. Ganap na binubuksan ng compiler ang chain sa yugto ng pagsusuri.

Maaari bang ideklara ang typealias sa loob ng function?

Hindi, ang typealias ay isang deklarasyon sa pinakamataas na antas o miyembro ng klase/object. Sa loob ng mga function, hindi maaaring ideklara ang typealias. Para sa lokal na pagpapaikli ng mga uri, gamitin ang import alias sa loob ng file o ilipat ang typealias sa antas ng module.

Buod

  • Typealias — kasingkahulugan para sa umiiral na uri, hindi lumilikha ng bagong uri at nabubura sa yugto ng compilation
  • Mga functional na uri — pangunahing lugar ng aplikasyon: pinapalitan ng typealias ang (T) -> R ng nababasang pangalan tulad ng Callback
  • Mga generics sa typealias ay nagpapahintulot sa paglikha ng generic na mga alias Mapper para sa anumang uri
  • Mga nested class — pinapaikli ng typealias ang pag-access sa malalim na nested na uri at mahabang pangalan mula sa mga library
  • Kaligtasan ng uri ay wala: ang typealias ay ganap na napagpapalit ng orihinal na uri
  • Value class — alternatibo sa typealias kapag kailangan ang mahigpit na pagsusuri ng uri na may zero na gastos sa runtime
  • Pagiging madaling mabasa — pangunahing bentahe: ang mga makabuluhang pangalan ng uri ay ginagawang self-documenting ang code nang walang overhead

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din