添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

可索引的类型

与使用接口描述函数类型差不多,我们也可以描述那些能够“通过索引得到”的类型,比如 a[10] ageMap["daniel"] 。 可索引类型具有一个 索引签名 ,它描述了 对象索引的类型 ,还有相应的 索引返回值类型 。 让我们看一个例子:

interface StringArray {
  [index: number]: string;   //索引签名
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];

上面例子里,我们定义了StringArray接口,它具有索引签名。 这个索引签名表示了当用 number去索引StringArray时会得到string类型的返回值。

TypeScript支持两种索引签名:字符串数字可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。 这是因为当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。 也就是说用 100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致。

class Animal {
    name: string;
class Dog extends Animal {
    breed: string;
// 错误:使用数值型的字符串索引,有时会得到完全不同的Animal!
interface NotOkay {
    [x: number]: Animal;
    [x: string]: Dog;
//编译OK
interface Okay {
    [x: number]: Dog;     //Dog是Animal子类
    [x: string]: Animal;

字符串索引签名能够很好的描述dictionary模式,并且它们也会确保所有属性与其返回值类型相匹配。 因为字符串索引声明了 obj.propertyobj["property"]两种形式都可以。 下面的例子里, name的类型与字符串索引类型不匹配,所以类型检查器给出一个错误提示:

interface NumberDictionary {
  [index: string]: number;
  length: number;    // 可以,length是number类型
  name: string       // 错误,`name`的类型与索引类型返回值的类型不匹配

最后,你可以将索引签名设置为只读,这样就防止了给索引赋值:

interface ReadonlyStringArray {
    readonly [index: number]: string;
let myArray: ReadonlyStringArray = ["Alice", "Bob"];
myArray[2] = "Mallory"; // error!

你不能设置myArray[2],因为索引签名是只读的。

上文讲解可索引的类型语法及规则限制,我们来看下使用场景。

我们来看个例子:

我们传参的对象多了一个属性'colour',这个属性一个新属性。

interface SquareConfig {
    color?: string;
    width?: number;
function createSquare(config: SquareConfig) {
    // ...
let mySquare = createSquare({ colour: "red", width: 100 });  //编译失败,注意此时的colour属性拼写非'color',故意模拟新增一个属性,而非拼写错误

会报错误 Object literal may only specify known properties, but 'colour' does not exist in type 'SquareConfig'

绕开这些检查非常简单。 最简便的方法是使用类型断言:

let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);

然而,最佳的方式是能够添加一个字符串索引签名,前提是你能够确定这个对象可能具有某些做为特殊用途使用的额外属性。 如果 SquareConfig带有上面定义的类型的color和width属性,并且还会带有任意数量的其它属性,那么我们可以这样定义它:

interface SquareConfig {
    color?: string;
    width?: number;
    [propName: string]: any;      //返回值是any,如果是确定值,那么注意color和width的返回值类型必须是这个确定值的子集

还有最后一种跳过这些检查的方式,这可能会让你感到惊讶,它就是将这个对象赋值给一个另一个变量: 因为 squareOptions不会经过额外属性检查,所以编译器不会报错。

let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);
 

要留意,在像上面一样的简单代码里,你可能不应该去绕开这些检查。 对于包含方法和内部状态的复杂对象字面量来讲,你可能需要使用这些技巧,但是大部额外属性检查错误是真正的bug。 就是说你遇到了额外类型检查出的错误,比如“option bags”,你应该去审查一下你的类型声明。 在这里,如果支持传入 colorcolour属性到createSquare,你应该修改SquareConfig定义来体现出这一点。

官网可索引的类型与使用接口描述函数类型差不多,我们也可以描述那些能够“通过索引得到”的类型,比如a[10]或ageMap["daniel"]。 可索引类型具有一个 索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。 让我们看一个例子:interface StringArray { [index: number]: string; //索引签名}let myArray: StringArray;myArray = ["Bob", "Fred"];let myStr: str 我们获取属性的第二种方式,对象[值],使用成员表达式就叫做是索引器,索引器里面的内容不是ts 新增,这里只讨论如何ts 如何给索引器添加类型检查 不用索引器存在的问题 对象赋值绕过ts 检查 在TS中,默认情况下,不对索引器(成员表达式)做严格的类型检查使用配置.
TypeScript未知解析器 :joker: TypeScript是在编译时静态强制正确类型的好工具,但是当处理来自“外部世界”的未知数据时,TypeScript可能很快变成错误的安全性。 typescript-unknown-parser使用ES6类解析未知对象,如果出现错误,则抛出错误 缺少必需的属性 属性(必需和非必需)的类型错误。 npm i typescript-unknown-parser 创建一个具有预期类型属性的类。 通过从typescript-unknown-parser导入的UnknownParser对其进行扩展,并将该类作为通用类型参数传递。 用未知数据和类名调用super(data, 'MyClass') 使用protected函数设置所有属性: getPrimitive, getIsoDate, getArray, getStringAsEnumKey,
带应用程序生成器的 。 :face_with_monocle: 它是什么? 创建一个新的打字稿koa应用程序。 应用程序配置为使用TypeScript而不是纯JavaScript。 :thinking_face: 为什么要输入typescript-koa-starter? Node Js对于Web项目的快速开发很有用,但是由于缺乏类型安全性而经常被忽略。 TypeScript解决了这个问题,并且(连同其linter文件一起)甚至可以使您的代码比Java等其他静态语言更健壮。 :gear_selector: 安装 $ npm install -g typescript-koa-starter :rocket: 快速开始 最快的入门方法是使用npx并输入要创建的项目的名称。 如果您未指定
查找一维数组指定数据下标 //findIndex中需要传入一个函数,此函数的目的是为了传入你的查找条件, //x对应的是数组subUserIdList的每个数据,x === itemTwo.userId是查找数据中与itemTwo.userId相等的下标 subUserIdList.findIndex((x) => x === itemTwo.userId) 如果想将findIndex与其他操作数组的方法连用,可以如 npm install create-ts-index --save-dev 下一代导出生成工具。 ctix使用TypeScript编译器API。 因此在create-ts-index中解决了许多问题。 例如,单独的项目(由tsconfig.json使用)并支持默认功能,自动检测具有导出语句的文件等。我需要更多帮助来改善ctix。 创建要导出的index.ts文件。 如果index.ts中没有仅用于导出的业务逻辑,则create-ts-index有助于轻松导入。 或者,如果您有图书馆项目需要此导出过程(例如,blueprint.js等)。 cti(create-ts-index)创建导出index.ts文件。 例如,下面的示例目录。 app.ts component/ Nav.ts Button.t
用了 TypeScript 之后,我们就可以声明类型,然后给 js 变量加上这个类型。 也会做类型检查,但也不是所有的变量都要手动声明类型,因为 ts 会做自动类型推导,同样是有类型提示和检查的,而且推导的时候还可以加上 as const,这样推导出的是字面量类型(不过会有 readonly 的修饰),那问题来了,什么时候手动声明类型,什么时候用自动推导呢? 比如 obj,b 属性推导出的是 string,但其实也可能是一个 number。但给它赋值 number 会报错,这种就得手动声明类型了。还有,函数的参数,只有调用的时候才能知道参数具体的类型,这时候怎么自动推导? 没办法推导。 所以也得手动声明类型。总之,ts 代码包括自动推导出的类型、手动声明的类型两种。 自动类型推导省去了很多写类型的麻烦,但很多情况下还是要手动声明类型的。 但手动声明的类型是有局限性的。
TypeScript 中,定义一个接口时,如果写了 `length: number`,就意味着在这个接口中,有一个叫做 `length` 的属性,类型为 `number`。 举个例子,你可以这样定义一个接口: interface MyInterface { length: number; 这个接口表示,它里面有一个名为 `length` 的属性,类型为 `number`。那么,任何想要实现这个接口的对象,就必须有一个名为 `length` 的属性,类型为 `number`。 比如,你可以这样写: const obj: MyInterface = { length: 10, 这个对象就实现了 `MyInterface` 这个接口,因为它有一个名为 `length` 的属性,类型为 `number`。