2017-06-14 31 views
0

我試圖讓類型檢查上設置屬性上的變量類型RefBasketType型檢查,設置預先定義的接口

下面的函數中的值是一個測試代碼:

export class BaseTest { 
    __base: null; 
} 
export class Test1 extends BaseTest { 
    __test: null; 
} 
export class Test2 extends BaseTest { 
    __test2: null; 
} 
export type RefBasketType = { 
    t1?: Test1; 
    t2?: Test2; 
}; 

const testRefBasket: RefBasketType = {}; 

function test<U, T extends {}, K extends keyof T>(
    key: K, testC: U, basket: T 
) { 
    basket[key] = testC; 
} 

test('t1', new Test1(), testRefBasket); // passes (ok!) 
test('t1', new Test2(), testRefBasket); // no error here.(UH-OH) 
test('t3', new Test1(), testRefBasket); // error (ok!) 

正如你所看到的,

test('t1', new Test2(), testRefBasket); // no error here.(UH-OH) 

通行證,即使它不應該有。

還有什麼我應該用在打字稿上,還是甚至不可能用最新版本的打字稿?

謝謝!

回答

1

可以更改testC參數的類型是T[K]

function test<U, T extends {}, K extends keyof T>(
    key: K, testC: T[K], basket: T 
) { 
    basket[key] = testC; 
} 

test('t1', new Test1(), testRefBasket); // passes (ok!) 
test('t1', new Test2(), testRefBasket); // error. RefBasketType.t1 != Test2 
test('t3', new Test1(), testRefBasket); // error (ok!)