type-check on函数,用于在预定义接口上设置值

时间:2017-06-14 06:51:23

标签: typescript typescript2.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 个答案:

答案 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!)