簡體   English   中英

將泛型類型約束為文字類型

[英]Constrain a generic type to be a literal type

我的問題是雙重的:

  1. 我想知道TypeScript中是否有一種方法可以將泛型約束為某種類型的文字類型。 我的意思是function foo<T is a string literal>(...) 我最接近這種行為的是function foo<T extends string> ,但這允許字符串文字的聯合和類型“字符串”本身作為T的值。
  2. 如果在TypeScript 2.1中無法實現這一點,那么從設計角度來看,實現這樣的功能是否有意義?

我的用例是定義一個像這樣的curried函數prop

function prop<K extends string, U>(name: K): <T extends { [P in K]: U  }>(obj: T) => T[K] {
    return (obj) => obj[name];
}

prop<'name', number>("name")({
    name: 3
})

如果K是字符串文字,則此示例按預期工作,但是功能類型的類型檢查Kstring

我知道這有點做作; 請不是我的目標不是解決一個實際問題(盡管它會),而是更多地嘗試使用TypeScript的類型系統。

謝謝!

我認為這里的問題在於你根據通用約束把馬放在馬前:在你知道對象之前嘗試約束允許的鍵是沒有意義的。

這是一個我想你想要完成的例子:

function propGetter<O>(o: O): <K extends keyof O>(key: K) => O[K] {
    return k => o[k];
}

let prop = propGetter({
    id: 10,
    firstName: "Dununuh Hunudunuh"
});

let id = prop("id");               // number
let firstName = prop("firstName"); // string
let foo = prop("foo");             // Type error

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM