赞
踩
目录
Contextual Typing【上下文映射,上下文类型】
- type SomeConstructor = {
- new (s: int):String
- }
- function fn(ctor: SomeConstructor) {
- return new ctor("hello")
- }
- const str = fn(String)
- console.log(str) // hello
- function firstElement<Type>(arr: Type[]):Type {
- return arr[0]
- }
- // map : a -> b
- function map<Input, OutPut>(arr: Input[], func: (arg: Input) => Output): Output[] {
- return arr.map(func); // Output[]
- }
- const parsed = map(["1", "2", "3"], (n) => parseInt(n))
- // [1,2,3]
- function minimumLength<Type extends { length: number }>(
- obj: Type,
- minimum: number
- ): Type {
- if (obj.length >= minimum) {
- return obj;
- } else {
- return { length: minimum };
- // 不能将类型“{ length: number; }”分配给类型“Type”。
- // "{ length: number; }" 可赋给 "Type" 类型的约束,
- // 但可以使用约束 "{ length: number; }" 的其他子类型实例化 "Type"
- }
- }
- function combine<Type>(arr1: Type[], arr2: Type[]):Type[] {
- return arr1.concat(arr2);
- }
- const arr = combine([1,2,3], ["hello"]);// Error 不能将类型“string”分配给类型“number”。
- const arr2 = combine<string | number>([1,2,3],["hello"]) // 手动指定string | number
- // 泛型的参数越简化越好,最少支持原则,高效,参数少
- function firstElement1<Type>(arr: Type[]) { // 更简单 √,方便阅读
- return arr[0];
- }
- function firstElement2<Type extends any[]>(arr: Type) {
- return arr[0]
- }
对比下一组,哪个更好?
- function filter1<T>(arr: T[], func: (arg: T) => boolean): T[] {
- // √ 泛型参数少,读起来方便
- return arr.filter(func);
- }
- function filter2<T, Func extends (arg: T) => boolean>(arr: T[], func: Func): T[] {
- // Func这个泛型没有必要
- return arr.filter(func);
- }
- function myForEach(arr: any[], callback: (arg: any, index?:number)=> void){
- // 可选参数index?:
- for (let i = 0; i < arr.length; i++) {
- callback(arr[i], i);
- }
- }
- <div onClick={ e=>{} }></div> // e是可选参数
- <div onClick={ ()=>{} }></div> // e是可选参数
- function add3<T> (a: T, b: T ) {
- return a + b // Error 运算符“+”不能应用于类型“T”和“T”。
- }
- // a,b不一定可以相加
- // 函数的重载,可多次,基础方法
- function add(a:number,b:number); // add(1,2)
- function add(a:string,b:string); // add("1","2")
- function add(a:number,b:string); // add(1,"2")
- function add(a:string,b:number); // add("1",2)
- function add(a:string); // add(1)
- function add(a: any,b?:any) {
- if(!b) {
- b = 1
- }
- return a + b
- }

- function isSet<T>(x: any): x is Set<T> {
- return x instanceof Set
- }
- function add(a: number, b: number): number;
- function add(a: string, b: string): string;
- function add<T>(a: Set<T>, b: Set<T>): Set<T>;
- function add<T>(a: T, b: T): T {
- if (isSet<T>(a) && isSet<T>(b)) {
- return new Set([...a, ...b]) as any
- }
- return (a as any) + (b as any)
- }
- const a = new Set<string>(["apple", "redhat"])
- const b = new Set<string>(["google", "ms"])
- console.log(add(a, b))
- console.log(add(1, 2))
- console.log(add("a", "k"))

- interface DB {
- exec(sql: string) => any
- }
- function runSql(this: DB, sql: string) {
- this.exec(sql)
- }
- runSql.bind(new DB()).("select * from user")
- // void
- type voidFunc = () => void;
- const f1: voidFunc = () => {
- return true;
- }
- const f2: voidFunc = () => true
- const f3: voidFunc = function () {
- return true;
- }
- function safeParse(s: string): unknown { // 比any安全
- return JSON.parse(s); // as 断言;断言之前,unknown值是不能直接赋值给其他变量的
- }
- // JS本身有这个方法
- function multiply(n: number, ...m: number[]) {
- return m.map((x) => n * x);
- }
- // 无法重新声明块范围变量“a”。
- const a = multiply(10, 1, 2, 3, 4);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。