2017-06-14 82 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!)