首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数接受无效的参数,没有错误。

函数接受无效的参数,没有错误。
EN

Stack Overflow用户
提问于 2017-01-31 11:24:23
回答 2查看 1.5K关注 0票数 1

我正在努力了解打字稿所提供的类型安全性的程度。我遇到了一种情况,我希望会出现错误,但是类型记录不会抱怨。

我定义了一个函数,它的参数与某个接口相匹配。然后我用一些不匹配的参数调用函数。这是代码(或在操场上 )

代码语言:javascript
复制
interface ArgumentInterface {
    [key: number]: string
}

interface InvalidArgumentInterface {
    [key: string]: number
}

interface InvalidArgumentInterface2 {
    foo: number
}

function myFunction(arg: ArgumentInterface) {
    // function body
}

let validArgument: ArgumentInterface = {};
validArgument[5] = 'I am a string';

let invalidArgument: InvalidArgumentInterface = {
    foo: 42
};

let invalidArgument2: {foo: number} = {
    foo: 42
};

let invalidArgument3: InvalidArgumentInterface2 = {
    foo: 42
};

let invalidArgument4 = {
    foo: 42
};

myFunction(validArgument); // no typescript error, as expected
myFunction(invalidArgument); // typescript error, as expected
myFunction(invalidArgument2); // no typescript error!
myFunction(invalidArgument3); // typescript error, as expected
myFunction(invalidArgument4); // no typescript error!

当我的参数变量显式声明一个不兼容的接口时,我会得到一个预期的类型记录错误。但是,当我的参数变量声明类型为文字(没有接口)或声明根本没有类型时,类型记录一点也不抱怨,尽管我希望会出现错误。

我将"noImplicitAny“标志设置为true。

有人能解释一下这种行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-31 11:48:10

你不会因为以下原因而出错:

代码语言:javascript
复制
myFunction(invalidArgument2);
myFunction(invalidArgument4);

因为它们的类型是{ foo: number; },而且与ArgumentInterface的定义并不矛盾,所以值可以两者兼而有之:

代码语言:javascript
复制
let a = {
    1: "one",
    2: "two",
    foo: 4
}

在这里,用数字索引的内容有一个字符串值,但是foo索引有一个数字值。

如果ArgumentInterface是:

代码语言:javascript
复制
interface ArgumentInterface {
    [key: number]: string;
    [key: string]: string;
}

然后你就得到了你所期望的错误。

票数 2
EN

Stack Overflow用户

发布于 2017-01-31 11:31:50

这是因为TypeScript使用结构类型 (像Ocaml)。

invalidArgument2invalidArgument4在结构上都与ArgumentInterface兼容,因此,TypeScript乐于接受它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41956347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档