String.replace()方法的第二个参数的类型检查是不一致的?

时间:2016-10-08 14:05:08

标签: typescript

下面是TypeScript中非常简单的示例。你能解释为什么第二个表达式在"测试"部分是有效的(其他不是,因为它是预期的)相应的TS操场?

let p = '{pattern}';
let a = 'bar ' + p + ' foo';
let h: { key: string } = { key: a};
let k = 'key';
let n = 0;

// tests
a.replace(p, n);
h[k].replace(p, n);
h.key.replace(p, n);
h['key'].replace(p, n);

我最好的猜测是,它以某种方式与哈希/或与之相关的工作有关,但我缺乏一些知识..

1 个答案:

答案 0 :(得分:1)

第二次测试:

h[k].replace(p, n);

编译器没问题,因为h[k]的类型为any,因为您正在使用索引访问该属性。
如果您希望编译失败,则需要执行以下操作:

let h: { [key: string]: string } = { key: a };
h[k].replace(p, n); // Error: Argument of type 'string' is not assignable to parameter of type 'RegExp'

code in playground`