我试图对一个函数进行类型检查,该函数在类型为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)
通过,即使它不应该。
我是否应该在打字稿中使用更多内容,或者即使是最新版本的打字稿也是不可能的?
谢谢!
答案 0 :(得分: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!)