2016-06-01 152 views
0

我的目標是讓一個具有typescript字符串枚舉屬性部分的對象。Enum for Typescript中的索引簽名參數類型

type PARAM = "long-parameter" | "long-parameter2"; 

const PARAM = { 
    param1: "long-parameter" as PARAM, 
    param2: "long-parameter2" as PARAM, 
} 

var f = function(params:{[id:PARAM]:number}){} 

f({ //must be valid 
    [PARAM.param1]:1, 
}); 

f({ //should display error 
    "asdas":1 
}); 

的問題是,var f = function(params:{[id:PARAM]:number}){}返回錯誤An index signature parameter type must be string or number.

有周圍的什麼辦法?

回答

1

索引簽名的密鑰必須是字符串或數字。這只是因爲JavaScript的工作原理(在對象成員查找中,所有內容都轉換爲string)。

如果您知道會員的姓名,那麼您應該事先聲明他們的姓名。這是如下圖所示:

type PARAM = "long-parameter" | "long-parameter2"; 

const PARAM = { 
    param1: "long-parameter" as PARAM, 
    param2: "long-parameter2" as PARAM, 
} 

var f = function(params: { "long-parameter"?: PARAM, "long-parameter2"?: PARAM }) { } 

f({ //must be valid 
    [PARAM.param1]: 1, 
}); 

f({ //should display error 
    "asdas": 1 
}); 

測試與alm

enter image description here

+0

如何有效分配工作 - '1'不是字符串值'長parameter'或'長parameter2'但接口的值被設置爲'PARAM' ...爲什麼'f({[PARAM.param1]:1})'成功編譯? –