我想根據道具將物件屬性設定為布林值或布爾陣列值。
但是當鍵值作為變數而不是文字字串值接收時,它會顯示錯誤。
我不知道兩者的區別。
export interface State {
a: {
[key: string]: any[];
};
b: {
[key: string]: boolean | boolean[];
};
}
const state:State = {
a: {},
b: {},
}
const key:string = "test key";
// this works
let test1 = typeof state.b["test key"] === 'object' && state.a["test key"][0];
// type error : Property '0' does not exist on type 'boolean | boolean[]
let test2 = typeof state.b[key] === 'object' && state.b[key][0];
uj5u.com熱心網友回復:
第一個索引簽名有效,因為您使用的是any. 任何都可以,你state.a["test key"]可以對它做任何事情any,包括對它進行索引。因此,這實際上有效也就不足為奇了。
您的第二個示例不起作用的原因是打字稿不會使用變數縮小索引訪問范圍。所以這有效:
export interface State {
[key: string]: boolean | boolean[];
}
const state:State = {
}
let test2 = typeof state["test key"] === 'object' && state["test key"][0];
游樂場鏈接
替代方法是使用型別斷言,或者將 idex 操作的結果放在變數中并縮小范圍:
const key:string = "test key";
// This does not work
let test2 = typeof state[key] === 'object' && state[key][0];
// This works
let keyValue = state[key];
let test3 = typeof keyValue === 'object' && keyValue[0];
// Or with a assertion
let test4 = typeof state[key] === 'object' && (state[key] as boolean[])[0];
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/451161.html
