簡體   English   中英

打字稿:獲取泛型類型

[英]Typescript: get type of generic type

我是 Typescript 的新手(來自 C#),我正在努力處理“特殊”的通用實現。

這是我的代碼:

function createValue<TValue extends string | boolean>(): TValue[]
{
    let result = new Array<TValue>();

    if (typeof TValue === "string") // error 'TValue' only refers to a type, but is being used as a value here
    {
        result[0] = "abc" as TValue;
    }
    else
    {
        result[0] = false as TValue;
    }

    return result;
}

console.log(createValue<boolean>());

我是怎么得到類型的?

我已經嘗試過非常丑陋的解決方案來創造價值,但這也不符合預期。

let value : TValue = new Array<TValue>(1)[0];
let type = typeof value; // undefined

對象類型存在多種解決方案,但我沒有為基元找到它。

你能給我任何幫助嗎?

謝謝

您的問題在於在運行時使用 TypeScript 類型。 TypeScript 被編譯為 JavaScript,因此您的執行根本看不到TValue類型。

typeof運算符用於在其他地方而不是在運行時重用類型信息。 例如

function test(arg: string): boolean;

function test2(func1: typeof test): boolean;

根據您想要實現的目標,您需要提供一個字符串參數來指定您的操作。

function createValue(type: 'string' | 'boolean') {
    let result = new Array();

    if (type === "string") 
    {
        result[0] = "abc";
    }
    else
    {
        result[0] = false;
    }

    return result;
}

console.log(createValue('boolean'));

TypeScript 應該能夠從那里推斷出您的類型。 如果沒有,您可以查看條件類型

因為類型在運行時不存在,所以我最終得到了這樣的解決方案:

enum Types
{
    string,
    boolean,
    number
}

function getType<TValue extends Types.string | Types.boolean>(t: TValue): Array<TValue extends Types.string ? string : boolean>
{
    if (<Types>t == Types.string)
    {
        let arr = new Array<string>();
        arr[0] = "abcd";
        return arr as Array<TValue extends Types.string ? string : boolean>;       
    }

    let arr = new Array<boolean>();
    arr[0] = false;
    return arr as Array<TValue extends Types.string ? string : boolean>;     
}

console.log(getType(Types.boolean));

暫無
暫無

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

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